1

Я разработал свои классы с использованием карт CRC, и у меня есть прекрасный набор объектов, которые содержат домен/бизнес-логику и данные (свойства). Некоторые классы требуют сохранения и чтения из базы данных.Где мои объекты/модели живут, если они содержат функциональность домена?

Мое хранилище должно существовать в отдельном проекте для моих объектов домена, но для их создания необходимо ссылаться на них.

Однако объекты/объекты домена должны иметь возможность ссылаться на репозиторий.

Я мог бы поместить объекты в репозиторий, но поскольку они содержат функциональность домена, это не совсем правильно.

Я мог бы поместить объекты, которые требуют настойчивости в общем совместном проекте, но опять-таки неправильно их выделять.

Куда его положить? Я не могу почувствовать, что упускаю что-то очевидное.

+0

Почему ваши объекты/сущности должны ссылаться на репозиторий? – DavidGouge

+0

У вас все в значительной степени сказано то же самое. Я не думал о размещении интерфейсов репозитория в проекте домена. –

ответ

4

Объекты или объекты домена не должны использовать репозитории. В службах домена/приложений должны использоваться репозитории. И это сделано очень просто - вы должны определить интерфейсы репозитория в своей сборке модели домена и использовать их в службах домена/приложения.

домена библиотека должна содержать

  • домена Модель
  • Repository Интерфейсы
  • Domain Services (использовать только интерфейсы репозиториев)

Эта библиотека не ссылается на другие библиотеки - это сидит в центре вашей системы.

Библиотека сохранения данных должна содержать реализацию репозиториев, специфичных для вашего поставщика данных. Например. он может использовать Entity Framework. Эта библиотека должна ссылаться на вашу библиотеку домена. Таким образом, он будет знать о интерфейсах, которые он должен реализовать, и о объектах, с которыми он должен работать.

+1

Это кажется самым ясным ответом, спасибо, я попадал в путаницу –

0

Однако объекты/объекты домена должны иметь возможность ссылаться на репозиторий.

Есть ли они? Или они должны ссылаться на интерфейс репозитория? Тогда сам репозиторий - это просто реализация этого интерфейса, детали низкого уровня, которые не нужны логическому коду домена.

Как я обычно структурировать репозиторий шаблон в моих проектов:

  • Основной проект домена (бизнес-модели, основной бизнес-логики, интерфейсы для зависимостей)
  • зависимостей Проекты (ссылки Ядро проекта домена, инвентарь интерфейсы)
  • Проекты приложений (ссылки Проект ядра домена, ссылки на проекты зависимостей либо напрямую, либо через конфигурацию, либо через посреднический проект, который обрабатывает инъекцию зависимостей)

В качестве примера предположим, что я использую Service Locator для моей инъекции зависимостей (что я часто делаю). Тогда бизнес-модели должны только ссылаться на объект Service Locator (который сам поставляется заводом и может быть введен). Таким образом, внутренний к бизнес-модели, я мог бы что-то вроде этого:

public class SomeBusinessModel 
{ 
    private ISomeDependency SomeProperty 
    { 
     get 
     { 
      return DIFactory.Current.Resolve<ISomeDependency>(); 
     } 
    } 
} 

DIFactory имеет статическое свойство Current, который является в основном фабричным методом возвращает инъекции зависимостей распознавателя, а его интерфейс имеет метод, называемый Resolve, который принимает тип и возвращает экземпляр.

Так что в этом случае ...

  • SomeBusinessModel находится в области базового проекта
  • ISomeDependency находится в области базового проекта
  • IDIContainer (тип возвращаемого значения для Current) находится в домене Ядра Проект
  • DIFactory находится в Проекте ядра домена и инициализирован (он имеет метод Initialize, который устанавливает текущий контейнер для инъекций) с помощью проекта приложения для инъекционного контейнера конкретных зависимостей
  • SomeDependency (фактический типа экземпляра возвращается в распознавателе) находится в Dependency проект

В этой установке, бизнес-модели знают, что там должны быть хранилищем, и требуют что они поставляются, но у них нет жесткой зависимости от них. Приложение предоставляет фактические реализации для этих репозиториев либо напрямую, предоставляя экземпляр, либо косвенно, настраивая контейнер инъекции зависимостей для предоставления экземпляра.

Все фактические значения зависимостей inward от деталей реализации (приложений и зависимостей) до основной бизнес-логики. Никогда не наружу.

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