2015-05-19 3 views
9

В настоящее время я нахожусь в разработке большого веб-приложения, в основном содержащего Angular SPA и OData WebAPI, который имеет доступ к бэкэнд-слоту.
Мы находимся на ранней стадии и начали внедрять первые классы, включая Model.dll, который находится в общем пространстве имен, чтобы к нему можно было получить доступ всеми слоями.
Теперь мы обсуждаем эти DTO в модели. Некоторые говорят, что использование интерфейсов абсолютно необходимо, поэтому код будет выглядеть так:Интерфейсы для DTO

namespace MySolution.Common.Model 
{ 
    public interface IPerson 
    { 
     int Id { get; set; } 
     string Name { get; set; } 
     ... 
    } 
} 

namespace MySolution.Common.Model 
{ 
    public class PersonDTO : IPerson 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     ... 
    } 
} 

Вот и все. Просто простые DTO без разума.
Теперь я спрашиваю себя, действительно ли это хороший подход, потому что я не вижу необходимости использовать интерфейс здесь.
В чем преимущества этого? Было упомянуто тестируемость, но еще нужно проверить DTos? Инъекция зависимости также не должна быть точкой.
Любое просвещение было бы очень полезно. В конце обучения новые вещи и подходы всегда хороши ...

+0

Нет смысла использовать интерфейс, если он вам не нужен. Это является чрезмерным, что должно быть простым объектом. –

+1

Если * DTO * - это просто список свойств, я вижу это бессмысленным. Если у вас был какой-то репозиторий, вы бы, например, связали это, чтобы заменить соединение с БД на поддельное представление. Если у вас есть 'Person GetPerson()', вы можете иметь версию DB и Fake. – christiandev

+0

Вы можете пометить интерфейс маркера на DTO ('FooDto: IAmADto') для ограничений типов и сопоставлений, но в остальном, какая цель это обслуживание? Здесь нет абстракции, в зависимости от «IPerson» вы получаете ровно такой же уровень сцепления, что и в зависимости от «Человека». –

ответ

3

Состояние передачи DTO - все. Ввод их через контейнер или издевательство над ними для тестирования кажется бессмысленным (если это мотивация) и совершенно ненужным. Не делай этого.

2

В качестве примера, далее на мой комментарий выше:

Interface IRepo 
{ 
    Person GetPerson(int id); 
} 

Public class DbRepo : IRepo 
{ 
    public Person GetPerson(int id){//get person from database} 
} 

Public class FakeRepo : IRepo 
{ 
    public Person GetPerson(int id) 
    { 
    return new Person {Id = id, Name = "TestName"}; 
    } 
} 

вы будете использовать FakeRepo с некоторыми фиктивных объектов для целей тестирования.

+0

Я бы это понял, чтобы использовать интерфейс для этого случая. В моем случае я получаю объекты из другой службы, которая может быть базой данных в любое время, и сопоставляю эти объекты с моими DTos с помощью 'Automapper'. –

+0

Как я уже упоминал в комментарии выше, бессмысленно иметь интерфейс для простого DTO. – christiandev

Смежные вопросы