我正在实现一种使用单个数据存储但分开查询和命令模型的CQRS形式。对于我正在实施DDD的命令方面,包括存储库,IoC和依赖注入。对于查询方面,我使用here所述的Finder模式。基本上,查找器类似于存储库,但仅限于查找方法。CQRS - 接口和依赖注入是否需要读取模型?
因此,在我的应用程序中,在我的DAL中,我使用ADO.net和原始SQL来执行我的查询。 ADO.Net的东西都被抽象成一个漂亮的帮助器类,这样我的Finder类就可以简单地将查询传递给ADO帮助器,该帮助器返回查找器/映射器类转换为读取模型的通用数据对象。
当前,Finder方法(如我的命令存储库)通过注入到我的控制器的接口进行访问,但我想知道接口,DI和IoC是否对查询方过度杀手,因为我已经阅读了有关CQRS的阅读方建议使用“瘦数据层”。
为什么不直接访问我的Finders?我理解接口和DI的论点。即分离关注点和可测试性。在SOC的情况下,我的DAL已经通过使用映射器类并将ADO.net内容放入辅助类中分离出数据库特定的逻辑。就测试而言,根据this question单元测试读取模型不是必需的。
public class PersonController : Controller
{
private IPersonFinder _person;
public PersonController(IPersonFinder person)
{
_person = person;
}
public ActionResult Details(int id)
{
Person person = _person.GetByID(id);
// TODO: Map person to viewmodel
return this.View(viewmodel);
}
}
但是如果你想将一些横切关注点应用到你的'PersonFinder'上呢?当你将它应用到静态类时,这将是非常困难的(和很多重复的代码),而如果一个接口被注入,你可以自由地用装饰器,代理,拦截器或其他任何模式来包装该实例在你的工具箱中。 – Steven