Я тихий новичок в DDD, поэтому не стесняйтесь комментировать, если вы не согласны, как вы, я здесь, чтобы узнать.
Лично я не понимаю, почему вы должны ссылаться на уровень инфраструктуры из вашего домена. На мой взгляд, домен не должен зависеть от инфраструктуры. Объекты Домена должны полностью не знать, в какой базе данных они работают или какой тип почтового сервера используется для отправки почты. Абстрагируя домен от инфраструктуры, его проще использовать повторно; потому что домен не знает, на какой инфраструктуре он работает.
То, что я делаю в своем коде, ссылается на уровень домена из моего уровня инфраструктуры (но не наоборот). Репозитории знают объекты домена, потому что их роль заключается в сохранении состояния домена. Мои репозитории содержат мои основные операции CRUD для моих корневых агрегатов (get (id), getall (), save (object), delete (object) и вызываются из моих контроллеров.
Что я делал в своем последнем проекте (мой подход не просто DDD, но он работал довольно хорошо), так это то, что я абстрагировал свои репозитории с интерфейсами. Корневые агрегаты должны быть созданы путем передачи конкретного типа репозитория:
Корневой агрегат должен был создаваться через репозиторий с помощью метода Get (ID) или Create () из репозитория. Конкретный репозиторий, создающий объект, прошел сам, так что агрегат мог сохранить его состояние и состояние его дочерних объектов, но ничего не зная о конкретной реализации репозитория.
e.g.:
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);
}
}