Одна вещь, которую я вижу в некоторых корпоративных приложениях 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;}
}
Но в последнее время я все больше убеждаюсь, что это, по сути, анти-шаблон.
Я запустил его некоторыми архитекторами в сообществе с открытым исходным кодом, и они говорят, что это основано на ошибках дизайна или недостатках, где-то в цепи дизайна.
Поэтому я говорю своим коллегам, что они должны прекратить создавать интерфейсы для объектов Domain. Поскольку для них нет никакой цели, и вы должны обновлять интерфейс всякий раз, когда вы обновляете объекты домена.
Сначала было заявлено, что эти интерфейсы обеспечивают "развязку", но я отменяю это, потому что интерфейсы имеют взаимно-однозначные отношения с объектами домена, что они действительно не обеспечивают никакой развязки, изменение интерфейса изменение объекта домена и наоборот.
Следующее утверждение состоит в том, что нам нужны интерфейсы для тестирования. Мой счетчик - это то, что Rhino-mocks обеспечивает насмешливость и укусы конкретных классов. Но они утверждают, что у носорогов есть проблемы с конкретными классами. Я не знаю, покупаю ли я это, даже если у носорогов есть проблемы с конкретными классами, это не обязательно означает, что мы должны использовать интерфейсы для объектов домена.
Так что мне любопытно:
Почему у вас есть индивидуальные интерфейсы для ваших объектов домена?
Почему бы и нет?
Почему это хорошая или плохая практика?
Спасибо за чтение!
EDIT: я должен отметить, что я все время использую интерфейсы, и я считаю, что если он потребует, я буду использовать интерфейс при падении шляпы. Но я специально ссылаюсь на объекты домена с индивидуальными интерфейсами.