c# - 从经典和 DDD 角度来看存储库的投影

标签 c# domain-driven-design repository-pattern

我想谈谈您如何看待存储库模式。

在“旧”域概念中(例如来自 P of EAAA ),存储库应该像一个“内存集合”,因此它应该始终返回相同的类型,因此如果您需要投影,则必须进行投影出来,那么投影将在例如服务层中进行,对吧?或者可以直接将其放入“Domain”项目中吗?

例如

public class CustomerRepository
{
    //Constructor accepts an IRepository<Customer>

    public IQueryable<Customer> GetAllDebtors()
    {
        //Use IRepository<Customer> here to make the query
    }
}

相反,在 DDD 中,存储库(尤其是与 CQRS 结合使用)可以直接返回投影类型,因为存储库变成了非规范化服务,对吧?

例如

public class CustomerDenormalizer
{
    //Constructor *could* accept an IRepository<Customer>

    public IQueryable<Debtor> GetAllDebtors()
    {
        //Use IRepository<Customer> here to make the query and the projection
    }
}

最佳答案

IMO,与“内存中”集合的对应关系被过分强调了。存储库不应该隐藏它封装了一些繁重 IO 的事实 - 这将是一个有漏洞的抽象。此外,IQueryable<T>这也是一个有漏洞的抽象,因为几乎没有任何提供者会支持所有操作。我建议将尽可能多的投影委托(delegate)给数据库,因为它非常擅长。

CQRS 中的投影有些不同。它通常被实现为事件使用者,更新存储在某些底层存储机制中的数据结构,这些机制本身可以是 SQL Server 或键值存储。在这种情况下,主要区别在于对消息队列中的事件的投影响应。这些事件可能来自外部系统。

关于c# - 从经典和 DDD 角度来看存储库的投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15813098/

相关文章:

design-patterns - 您使用工厂而不是构造函数来创建对象的阈值是多少?

android - RxJava2 中的存储库模式

C# 如何将 Expression<Func<SomeType>> 转换为 Expression<Func<OtherType>>

c# - 在 Visual Studio 中调试 .dll 会终止附加的 Excel session

c# - 如何通过Func发送一个方法执行到C#中的另一个方法?

c# - 如何用新值更新 XML 节点?

java - 在实体对象中创建服务层的新实例是否正确?

c# - Pushsharp 苹果通知 A call to SSPI failed 错误

domain-driven-design - CQRS-如何为场景执行系统建模

entity-framework - Entity Framework .Where 嵌套在 .Include 中