我想谈谈您如何看待存储库模式。
在“旧”域概念中(例如来自 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/