È una cattiva pratica usare la riflessione per fare inserimenti DB con dati da un servizio esterno?

4

Il webservice del nostro fornitore sta restituendo gli oggetti indirizzo (~ 30 campi) e sto usando LINQ e reflection per archiviare i dati restituiti direttamente nel databse. I loop sugli attributi e imposta il valore dall'oggetto alla classe LINQ.

Sono abbastanza nuovo per il refection e sono preoccupato che questa possa essere una cattiva pratica; salva ~ 30 righe di codice in 3 o 4 metodi, ma temo che possa introdurre dei bug difficili da correggere.

EDIT Ecco il codice. L'obiettivo è normalmente un'entità LINQ to SQL e l'input sarebbe un oggetto webservice.

public static void SetValues(object target, object input)
{
    Type targetType = target.GetType();
    Type inputType = input.GetType();

    PropertyDescriptorCollection inputProperties = TypeDescriptor.GetProperties(inputType);
    PropertyDescriptorCollection targetProperties = TypeDescriptor.GetProperties(targetType);

    foreach (PropertyDescriptor p in inputProperties)
    {
        object value = p.GetValue(input);

        var t = targetProperties.Find(p.Name, false);
        if (t != null && value != null)
        {
            if (value.GetType() == typeof(string) || value.GetType() == typeof(Int64) || value.GetType() == typeof(int) || value.GetType() == typeof(Boolean))
            {
                t.SetValue(target, value);

            }
            else if (value.GetType() == typeof(DateTime) || value.GetType() == typeof(DateTime?))
            {
                if ((DateTime)value > DateTime.MinValue)
                {
                    t.SetValue(target, value);
                }

            }
            else
            {
                t.SetValue(target, value.ToString());
            }
        }

    }
    
posta Tom Squires 14.10.2011 - 17:48
fonte

2 risposte

5

Personalmente, odio la riflessione nella maggior parte dei casi - ho visto è usato per aggirare le decisioni di progettazione sbagliate o perché le persone non sanno meglio il più delle volte.

Questo non è uno di quei casi - in realtà è una corrispondenza valore-chiave che si sta facendo e ha senso se si è disposti a mantenere sempre i nomi dei campi e i tipi in lock-step.

Detto questo, potresti voler esaminare AutoMapper come fa questo in circa 3 righe di codice e molto altro per l'avvio.

    
risposta data 14.10.2011 - 19:18
fonte
4

Da un punto di vista delle prestazioni, non c'è nulla di sbagliato in questo codice, poiché il tempo necessario per chiamare il database ridurrà le implicazioni sul rendimento della riflessione. Tuttavia, stai accoppiando il tuo oggetto dominio al tuo oggetto dati forzando i nomi e i tipi di proprietà a identici. Se questo non è un problema per te, penso che vada bene.

    
risposta data 14.10.2011 - 19:19
fonte

Leggi altre domande sui tag