DDD存储库和工厂

Omu*_*Omu 3 domain-driven-design solid-principles

从Matt Petters那里读过一篇关于DDD博客

并据说我们为每个实体创建一个存储库(接口),然后我们创建一个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(); 
}
Run Code Online (Sandbox Code Playgroud)

我想这可能是违反SOLID原则或其他原因的东西?

Mar*_*ann 6

有很多不同的方法可以做到这一点.这样做并不是单一的"正确"方式.大多数人更喜欢每个实体的存储库,因为它允许他们以更细粒度的方式改变域服务.这绝对适合SOLID中的'S'.

对于工厂而言,只有在增加价值时才能使用它们.如果它们只是包装一个new操作,它们就不会增加价值.

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

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