DDD: Где хранить доменные интерфейсы, инфраструктуру?

Имеет ли смысл сгруппировать все интерфейсы вашего уровня домена (модули, модели, сущности, доменные службы и т. Д.) На уровне инфраструктуры? Если нет, имеет ли смысл создавать «общий» проект / компонент, который объединяет все это в общую библиотеку? В конце концов, определение «уровень инфраструктуры» включает «общие библиотеки для уровней домена, приложения и пользовательского интерфейса».

Я подумываю создать свою кодовую базу вокруг уровней DDD: пользовательский интерфейс, приложение, домен, инфраструктура. Это создаст 4 проекта с уважением. Я хочу сказать, что вы ссылаетесь на уровень инфраструктуры с уровня домена. Но если вы определяете интерфейсы в проекте уровня домена, например, для IPost, тогда у вас будет циркулярная ссылка, когда вам нужно будет ссылаться на проект уровня домена из проекта инфраструктуры при определении метода IPostRepository.Save (IPost post). . Отсюда идея «определить все интерфейсы в общей библиотеке».

Возможно, репозиториям не следует ожидать сохранения объекта (IPostRepository.Save (IPost post); вместо этого следует ожидать параметров объекта (хотя это может быть длинный набор параметров в Save ()). Учитывая, что это может быть идеальная ситуация, которая показывает, когда объект становится чрезмерно сложным, и для этого следует изучить дополнительные объекты-значения.

Мысли?


person eduncan911    schedule 28.03.2009    source источник


Ответы (3)


Что касается места для размещения репозиториев, лично я всегда помещаю репозитории на выделенный уровень инфраструктуры (например, MyApp.Data.Oracle), но объявляю интерфейсы, которым репозитории должны соответствовать на уровне домена.
В моих проектах Уровень приложений должен иметь доступ к уровню домена и инфраструктуры, поскольку он отвечает за настройку уровня домена и инфраструктуры.
Уровень приложения отвечает за внедрение надлежащей инфраструктуры в домен. Домен не знает, с какой инфраструктурой он обращается, он только знает, как это назвать. Конечно, я использую контейнеры IOC, такие как Structuremap, для внедрения зависимостей в домен. Опять же, я не утверждаю, что DDD рекомендует структурировать ваши проекты таким образом, просто я создаю архитектуру своих приложений. Ваше здоровье.

person Geo    schedule 01.04.2009
comment
Отличная Geobarteam. Это дало мне приятный момент. Да, определите интерфейсы в Домене, репозитории должны быть реализованы в отдельных сборках (MySqlProviver, MsSqlProvider, XmlProvider и т. Д.). И какой-то тип контейнера IOC (мне очень нравится Castle Windsor) используется для его подключения на уровне приложения. Идеально. - person eduncan911; 01.04.2009
comment
В случае ASP.NET MVC на самом деле легко внедрить репозиторий в контроллер (уровень пользовательского интерфейса) через Castle Windosr. У Стивена Сандерсона был хороший пример этого в предварительной версии ASP.NET MVC Framework. В моей книге «Быстро управляемый дизайн» сказано, что интерфейс, приложение и домен могут использовать Infra. - person eduncan911; 01.04.2009
comment
Единственная проблема, с которой я столкнулся, заключается в том, что в моей книге говорится, что «Инфраструктура» ни на что не ссылается. UI- ›Приложение, домен и инфраструктура. Приложение- ›Домен и Инфра. И, домен- ›Инфра. Я знаю, я знаю, что все это в любом случае должно быть руководящим принципом. - person eduncan911; 02.04.2009
comment
Я считаю, что с этим ответом есть проблема. Уровень приложения отвечает за внедрение надлежащей инфраструктуры в домен. Луковая архитектура говорит нам, что инфраструктура не должна даже входить в уровень домена, она не должна ничего знать о необходимости отправлять электронное письмо для пример. Под этим я подразумеваю, что он не должен знать, что письмо нужно отправить, а не только то, что он не знает, что письмо отправлено. Причина в том, что мы пытаемся написать чистый базовый домен, который имеет только базовую бизнес-логику. Дополнительно, например, отправка электронного письма в качестве побочного эффекта разбавляет домен. - person Craig; 02.04.2021

Я новичок в DDD, поэтому не стесняйтесь комментировать, если вы не согласны, так как я здесь, чтобы узнать.

Лично я не понимаю, почему вы должны ссылаться на уровень инфраструктуры из своего домена. На мой взгляд, домен не должен зависеть от инфраструктуры. Объекты домена должны полностью игнорировать, в какой базе данных они работают или какой тип почтового сервера используется для отправки писем. Абстрагирование домена от инфраструктуры упрощает его повторное использование; потому что домен не знает, в какой инфраструктуре он работает.

В моем коде я ссылаюсь на уровень домена из уровня инфраструктуры (но не наоборот). Репозитории знают объекты домена, потому что их роль заключается в сохранении состояния домена. Мои репозитории содержат мои основные операции CRUD для моих корневых агрегатов (get (id), getall (), save (object), delete (object) и вызываются из моих контроллеров.

Что я сделал в моем последнем проекте (мой подход не является чисто DDD, но он работал довольно хорошо), так это то, что я абстрагировал свои репозитории с интерфейсами. Корневые агрегаты должны быть созданы путем передачи конкретного типа репозитория:

Корневой агрегат должен быть создан через репозиторий с помощью метода репозитория Get (ID) или Create (). Конкретный репозиторий, конструирующий объект, передал сам себя, так что агрегат мог сохранить свое состояние и состояние своих дочерних объектов, но ничего не зная о конкретной реализации репозитория. например.:

public class PostRepository:IPostRepository
{
     ...
    public Post Create()
    {
        Post post=new Post(this);
        dbContext.PostTable.Insert(post);
        return post;
     }
     public  Save(post)
     {
         Post exitingPost=GetPost(post.ID);
         existingPost = post;
         dbContext.SubmitChanges();
     }
}

public class Post
{

     private IPostRepository _repository
     internal  Post(IPostRepository repository)
     {
        _repository = repository;
     }
     ...
    Public Save()
    {
        _repository.Save(this);
     }

}
person Geo    schedule 29.03.2009
comment
Я знаю, к чему вы клоните. Просто в моей книге DDD упоминается, что репозитории находятся на уровне инфраструктуры. Но противоречивая информация, которую я нахожу в сети, помещает репозитории на уровень домена. - person eduncan911; 30.03.2009
comment
Также рекомендуется, чтобы уровень пользовательского интерфейса имел доступ к приложению, DOmain и инфраструктуре, уровень приложения - доступ к домену и инфраструктуре и, наконец, уровень домена - доступ к инфраструктуре. Это из книги DOmain Driven Design Quickly. Значит, в чем причина этого? - person eduncan911; 30.03.2009
comment
Это сложная информация. Я думаю, что я понял, что интерфейсы для репозиториев находятся на уровне домена, поскольку они определяют шов для домена. * Реализации репозиториев находятся на уровне инфраструктуры. Представьте, что вы решили полностью извлечь свой домен из текущего контекста приложения и построить новый. Вам нужны интерфейсы репозиториев, но не обязательно их реализации. - person jlembke; 15.07.2009

Я бы посоветовал вам подумать о луковой архитектуре. Он очень хорошо сочетается с DDD. Идея состоит в том, что интерфейсы вашего репозитория находятся на уровне за пределами домена и напрямую ссылаются на сущности:

IPostRepository.Save(Post post)

Домену вообще не нужно знать о репозиториях.

Уровень инфраструктуры не упоминается ни доменом, ни кем-либо еще и содержит конкретные реализации репозиториев среди прочего, связанного с вводом-выводом. Общая библиотека с различными помощниками в этом случае называется Application Core, и на нее может ссылаться кто угодно.

person Alexander Abramov    schedule 31.03.2009
comment
Неправильный. Интерфейс хранилищ доменов и шлюзов. Уровень инфраструктуры реализует их. - person Mik378; 04.11.2017