Domain driven design DDD存储库和工厂

Domain driven design DDD存储库和工厂,domain-driven-design,solid-principles,Domain Driven Design,Solid Principles,我读过一本书 根据这里的说法,我们为每个实体创建了一个存储库(接口),然后我们创建了一个RepositoryFactory,它将提供存储库的实例(声明为接口) 这就是使用DDD完成项目的方式吗 我的意思是,我看到一些项目,我认为他们使用DDD,但他们直接调用每个存储库,没有涉及工厂 而且 为什么我们需要创建这么多存储库类,为什么不使用 public interface IRepository : IDisposable { T[] GetAll(); T[] GetAll(Expression&

我读过一本书

根据这里的说法,我们为每个实体创建了一个存储库(接口),然后我们创建了一个RepositoryFactory,它将提供存储库的实例(声明为接口)

这就是使用DDD完成项目的方式吗

我的意思是,我看到一些项目,我认为他们使用DDD,但他们直接调用每个存储库,没有涉及工厂

而且

为什么我们需要创建这么多存储库类,为什么不使用

public interface IRepository : IDisposable
{
T[] GetAll();
T[] GetAll(Expression<Func> filter); 
T GetSingle(Expression<Func> filter); 
T GetSingle(Expression<Func> filter, List<Expression<Func>> subSelectors); 
void Delete(T entity); 
void Add(T entity); 
int SaveChanges(); 
}
公共接口IRepository:IDisposable
{
T[]GetAll();
T[]GetAll(表达式过滤器);
T GetSingle(表达式过滤器);
T GetSingle(表达式过滤器、列表子选择器);
无效删除(T实体);
无效添加(T实体);
int SaveChanges();
}

我猜可能是违反了坚实的原则,或者是其他什么?

有很多不同的方法。没有一种“正确”的方法可以做到这一点。大多数人喜欢每个实体都有一个存储库,因为它允许他们以更细粒度的方式改变域服务。这绝对符合固体中的“S”

对于工厂来说,只有当它们增加价值时才应该使用它们。如果它们所做的只是包装一个
new
操作,那么它们不会增加值

以下是一些工厂增值的场景:

  • Abtract工厂允许您独立于客户端代码改变存储库实现。这与SOLID中的“L”非常吻合,但是您也可以通过使用DI将存储库注入到需要它的域服务中来实现相同的效果
  • 当对象的创建本身是一个非常复杂的操作时(例如,in涉及的远不止创建一个新实例),最好将其封装在API后面