Одна вещь, которую я вижу в некоторых корпоративных приложениях DDD, над которыми я работаю, - это использование интерфейсов, идентичных сущностям домена, с однозначным сопоставлением свойств и функций. Действительно, объект домена всегда используется через интерфейс «один к одному», и все объекты домена имеют интерфейс «один к одному» в этом стиле.
Например:
Объект домена Учетная запись:
public class Account : IAccount
{
public string Name {get;set;}
//...some more fields that are also in IAccount
public decimal Balance {get;set;}
}
И это соответствует интерфейсу
public interface IAccount
{
string Name {get;set;}
//... all the fields in Account
decimal Balance {get;set;}
}
Но в последнее время я все больше убеждаюсь, что на самом деле это анти-паттерн.
Я управлял им некоторыми архитекторами в сообществе открытого кода, и они говорят, что это основано на ошибках или недостатках дизайна, где-то в цепочке дизайна.
Поэтому я говорю своим коллегам, что им следует прекратить создание интерфейсов для объектов домена. Потому что для них нет цели, и вы должны обновлять интерфейс всякий раз, когда обновляете сущности домена.
Сначала было заявлено, что эти интерфейсы обеспечивают «развязку», но я против, потому что интерфейсы имеют взаимно-однозначное отношение с объектами домена, что они на самом деле не обеспечивают развязки, что означает изменение интерфейса изменение сущности домена и наоборот.
Следующее утверждение состоит в том, что нам нужны интерфейсы для тестирования. Мой контраргумент состоит в том, что Rhino-mocks обеспечивает насмешку и заглушение конкретных классов Но они утверждают, что Rhino-mocks имеет проблемы с конкретными классами. Я не знаю, куплю ли я это, даже если у rhino-mocks есть проблемы с конкретными классами, это не обязательно означает, что мы должны использовать интерфейсы для сущностей домена.
Так что мне любопытно:
Зачем вам один-к-одному интерфейсы для сущностей вашего домена?
Почему бы и нет?
Почему это хорошая или плохая практика?
Спасибо за чтение!
РЕДАКТИРОВАТЬ : Я должен отметить, что я использую интерфейсы все время, и я верю, что, если он будет вызван, я буду использовать интерфейс без промедления. Но я конкретно имею в виду доменные сущности с однозначными интерфейсами.