gpt4 book ai didi

domain-driven-design - DDD 存储库和工厂

转载 作者:行者123 更新时间:2023-12-04 08:23:04 25 4
gpt4 key购买 nike

我读过 blog about DDD from Matt Petters

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

这是使用 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 原则,还是其他什么?

最佳答案

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

说到工厂,只有在增加值(value)时才应该使用它们。如果他们所做的只是包装一个 new 操作,他们就不会增加值(value)。

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

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

关于domain-driven-design - DDD 存储库和工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1515795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com