2009-10-04 80 views
3

我读过blog about DDD from Matt PettersDDD库和工厂

,并根据它就在那里说,我们为每个实体存储库(接口),之后我们创建了要给实例一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(); 
} 

我想这可能是违反了固体原则,或其他什么东西?

回答

6

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

在涉及到工厂时,只能在增值时使用。如果他们所做的只是包装new操作,它们不会增加价值。

这里有一些场景中,工厂增加价值:

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