Шаблон / Стратегия создания БО из DTO - PullRequest
3 голосов
/ 26 июня 2010

Мне нравится подход с объектами пакетов свойств (DTO), которые определяют интерфейс к моему серверу, но мне не нравится писать такой код:

void ModifyDataSomeWay(WibbleDTO wibbleDTO)
{
    WibbleBOWithMethods wibbleBO = new WibbleBOWithMethods();
    wibbleBO.Val1 = wibbleDTO.Val1;
    wibbleBO.Val2 = wibbleDTO.Val2;
}

Этот код копирования довольно трудоемкий для написания. Если копирование кода неизбежно, то куда вы его положите? В БО? На фабрике? Если можно вручную избежать написания кода на плите котла, то как?

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 26 июня 2010

Это похоже на работу для AutoMapper , или (проще) просто добавить несколько интерфейсов.

1 голос
/ 18 марта 2011

Automapper (или аналогичные инструменты) может быть путь вперед. Другим подходом может быть заводская модель.

Проще всего было бы что-то вроде этого:

class WibbleBO
{
    public static WibbleBO FromData(WibbleDTO data)
    {
        return new WibbleBO
        {
            Val1 = data.Val1,
            Val2 = data.Val2,
            Val3 = ... // and so on..
        };
    }
}
1 голос
/ 18 марта 2011

Это требует дополнительной обработки ошибок, и вам может потребоваться изменить ее так, чтобы она соответствовала свойствам, в которых типы данных не совпадают, но это показывает суть простого решения.

public void CopyTo(object source, object destination)
        {
            var sourceProperties = source.GetType().GetProperties()
                   .Where(p => p.CanRead);
            var destinationProperties = destination.GetType()
                .GetProperties().Where(p => p.CanWrite);
            foreach (var property in sourceProperties)
            {
                var targets = (from d in destinationProperties
                               where d.Name == property.Name
                               select d).ToList();
                if (targets.Count == 0)
                    continue;
                var activeProperty = targets[0];
                object value = property.GetValue(source, null);
                activeProperty.SetValue(destination, value, null);
            }
        }
...