Мне кажется, что доменные объекты (не доменные сущности , так как этот заголовок подразумевает что-то связанное с базой данных) не должны быть интерфейсами, если у вас нет веских причин полагать, что вам понадобится для поддержки нескольких реализаций в будущем.
Считайте, что модель предметной области является моделью человека. Бизнес / услуга / документ - это, буквально, домен. Большинство из нас разрабатывают программное обеспечение для одного бизнеса или цели. Если модель предметной области меняется, это происходит потому, что изменились бизнес-правила, и поэтому старая модель предметной области больше не действительна - нет смысла сохранять старую модель рядом с новой.
Дебаты явно не черно-белые. Возможно, вы разрабатываете программное обеспечение, которое сильно настроено на нескольких клиентских сайтах. Возможно, вам действительно потребуется реализовать разные наборы бизнес-правил одновременно и одновременно иметь реальную необходимость вписать их в единую архитектуру. Но, по моему опыту, по крайней мере, эти случаи являются скорее исключением, чем правилом, и хотя я обычно не люблю этот термин, это может быть случай, когда вам следует подумать про себя: ЯГНИ .
Доступ к данным - это общая область, в которой вам нужны более качественные абстракции ( постоянное невежество ). В вашем примере у вас есть атрибуты NHibernate в вашем классе модели. Но добавление атрибутов постоянства делает его уже не настоящим классом домена, поскольку оно вводит зависимость от NHibernate. NHibernate и Fluent NHibernate поддерживают сопоставление POCO с использованием объявления внешнего сопоставления вместо атрибутов в классе данных, и это, как правило, является предпочтительным подходом при использовании ORM, таких как NHibernate или EF4, поскольку это нарушает зависимость между моделью персистентности и моделью домена.
Если эти методы отображения не были поддержаны, и у вас было для использования атрибутов, тогда я действительно мог бы предложить вместо этого использовать интерфейсы, но сегодня ORM более сложны, чем использование рефлексии и динамических прокси и метода перехват, чтобы сделать большую часть тяжелой работы, поэтому вам не нужно создавать свои собственные абстракции здесь.
Некоторые типы объектов, которые вы хотели бы выставить как интерфейсы:
- Репозитории, отвечающие за загрузку / сохранение объектов домена;
- Плагины / расширения для вашей программы;
- Просмотр / модели презентаторов, чтобы можно было подключать различные интерфейсы;
- Абстрактные типы данных со множеством реализаций (массив, список, словарь, набор записей и таблица данных - это последовательности AKA
IEnumerable
);
- Абстрактные операции со многими возможными алгоритмами (сортировка, поиск, сравнение);
- Модели связи (те же операции по TCP / IP, именованные каналы, RS-232);
- Все, что связано с платформой, если вы планируете развернуть несколько (Mac / Windows / * nix).
Это ни в коем случае не полный список, но он должен осветить здесь основной принцип, который заключается в том, что для абстракций интерфейса лучше всего подходят вещи, которые:
- Зависит от факторов, которые могут быть вне вашего контроля;
- Вероятно, изменится в будущем; и
- Горизонтальные элементы (используются во многих частях приложения / архитектуры).
Класс домена будет широко использоваться, но не вписывается ни в одну из первых двух категорий; вряд ли это изменится, и вы почти полностью контролируете дизайн. Поэтому, если сами классы не будут принимать косвенные зависимости (что следует избегать при любых обстоятельствах), я бы не стал прилагать дополнительные усилия для создания интерфейса для каждого класса в модели предметной области.