DDD存储库和工厂

时间:2009-10-04 07:01:21

标签: domain-driven-design solid-principles

我读过blog about DDD from Matt Petters

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

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

1 个答案:

答案 0 :(得分:6)

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

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

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

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