Внедрение зависимостей - использовать с объектами передачи данных (DTO)? - PullRequest
6 голосов
/ 09 июня 2011

Рассмотрим код ниже (который был упрощен).У меня есть класс обслуживания, который возвращает список определенных объектов DTO, каждый из которых реализует свой собственный специфический интерфейс.В реальном коде они заполняются путем перебора набора данных, так как я работаю с устаревшим кодом.

Вопросы:

  1. Как создать / использовать DTO, не обновляя их или не используя анти-шаблон Service Locator?Нет особого смысла составлять пустой объект DTO в корне композиции и вставлять его в класс Service через конструктор, потому что на самом деле я использовал бы DTO как временную переменную при заполнении списка.

  2. В коде вы можете увидеть пример того, как я обновляю DTO.Но это не намного лучше, чем если бы я заставил DTO не реализовывать интерфейсы в первую очередь.Так не должны ли они реализовывать интерфейсы и, следовательно, не использовать DI с DTO?


public class Services : IServices
{    
    public IList<IDTO> GetDTOs()
    {    
        ...
        List<IDTO> dtos = new List<IDTO>();
        foreach (c in d) 
        {
            DTO dto = new DTO();
            dto.x = c.x;
            dto.y = c.y;
            dto.z = c.z;
            dtos.Add(dto);
        }
        return dtos;
    }    
}

Ответы [ 3 ]

12 голосов
/ 09 июня 2011

для меня не имеет большого смысла использовать DI для DTO.Я бы, вероятно, использовал Factory Pattern, чтобы получить DTO для своих объектов модели.

DTO не нужен их жизненный цикл, управляемый контейнером;Я бы просто new их.Не переусердствуй.

8 голосов
/ 09 июня 2011

Я не думаю, что DTO должны реализовывать интерфейсы, потому что они вряд ли реализуют поведение, которое изменится.

Их также не следует вводить.Не все объекты должны быть.Я думаю, что это подходящий вызов для new: создайте объект, используйте его, отпустите его из области видимости и станьте GC'd.

1 голос
/ 22 декабря 2011

Посмотрите на AutoMapper .И я согласен с @duffymo, я бы не использовал интерфейсы с DTO.AutoMapper - это основанный на соглашении объект для отображения объектов, который создаст и заполнит ваши DTO для вас.Если ничего другого, это сэкономит вам много печатать.Я прошел через написание процедур преобразования в / из DTO со связанными опечатками.Хотел бы я найти AutoMapper немного раньше.В случае вашего примера (где я номинально сделал объект "from" типа Order):

public class Services : IServices
{    
    public IList<DTO> GetDTOs()
    {    
        ...
        Mapper.CreateMap<Order, DTO>(); // move map creation to startup routine
        var dtos = new List<DTO>();
        foreach (c in d) 
        {
            dtos.Add( Mapper.Map<Order, DTO>(c));
        }
        return dtos;
     }
}

Или используя LINQ

public class Services : IServices
{    
    public IList<DTO> GetDTOs()
    {    
        ...
        Mapper.CreateMap<Order, DTO>(); // move map creation to startup routine
        return d.Select(c => Mapper.Map<Order, DTO>(c)).ToList();
     }
}
...