我将POC项目分配给了一个我要求实现命令查询分离,控制反转(具有依赖注入)和存储库模式的人。 “有人”给了我一个POC解决方案项目,但我不确定这是否就是这样做的。我将在此简要介绍POC项目
以下是如何全部设置的说明。有三个项目
以下是不同图层中代码的快照。
- NW.Web -
// A class in the Presentation Layer
public class CustomerPage
{
// Business layer Interface from NW.Business namespace
private ICustomerBusiness ICustB;
//DAL Read interface from NW.DataAccess.Read namepsace
private ICustomerRead<Guid> ICustR;
//Constructor for the Customer Page that uses Constructor Injection
public CustomerPage(ICustomerBusiness ICustB, ICustomerRead<Guid> ICustR)
{
this.ICustB = ICustB;
this.ICustR = ICustR;
}
}
- NW.Business -
//Declaration of business interface in the Business Layer
interface ICustomerBusiness
{
void Persist();
}
// A class in the Business Layer that implements the business interface
public class Customer: ICustomerBusiness
{
//Repository interface object that will be injected by Constructor Injection.
private ICustomerRepository ICustRep;
public Customer(ICustomerRepository ICustRep)
{
this.ICustRep = ICustRep;
}
public void Persist()
{
ICustRep.AddOrUpdate();
}
}
//Declaration of Repository interface in the Business Layer
public interface ICustomerRepository
{
void AddOrUpdate();
void Delete();
}
- NW.DataAccess -
public class CustomerRepository : ICustomerRepository
{
public void AddOrUpdate()
{
//implementation of Add or Update
}
public void Delete()
{
//implementation of Delete
}
}
//A Read interface in the Data Access Layer
interface ICustomerRead<T>
{
// A read is returned as DTO since in Database this may map to more than 1 table
CustomerDTO GetCustomerDetails(T id);
}
// An implementation of the Read Interface in the Data Access Layer
namespace NW.DataAccess.Read
{
public class CustomerRead<T> : ICustomerRead<T>
{
public CustomerDTO GetCustomerDetails(T id)
{
//implementation here
}
}
}
我的直觉是,这里有些不对劲。似乎CQRS或至少上述实现没有解决某些要求
有什么建议吗?
答案 0 :(得分:0)
我认为一般的概念是拥有“命令”和“查询”,并且在那些内容中你可以依赖于存储库。
我实际上已经重构了一个ASP.NET MVC项目,其中每个Controller都依赖于一个或多个存储库来完成它的工作。当我重构它时,我为每个需要发生的特定操作创建了“Command”和“Query”对象,这大大简化了每个控制器。然后在那些命令和查询中,我使用现有的存储库来执行逻辑。
这似乎是额外的努力,但我这样做的原因是因为解决方案也有缓存。缓存代码很乱,有缓存键被添加到整个地方或从中删除。通过将所有数据访问分离为命令和查询,然后在访问或更新数据时引发域事件,可以简化和分离缓存管理代码。
有关如何实现简单命令/查询分离的概述,请参阅我最近关于该主题的博文,其中还包含示例代码和NuGet包,以帮助您更快地进行设置: http://www.nootn.com.au/2013/03/command-query-separation-to-better.html
特别要回答你的问题“当所有业务对象都有一些共同的读取要求时会发生什么”:想象一下,我在那里的Query和Command类采用了一些常见的“IRepository”依赖,而不是“DBContext”。我的例子就是这样,你就可以在业务对象之间“共享”这个常见的读取要求。