3

我读过来自 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(); 
}

我想这可能是违反 SOLID 原则的原因,还是其他原因?

4

1 回答 1

6

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

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

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

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