我正在重构现有的MVC.Net应用程序以包含工作单元模式,以使数据管理更加明显和直接。
该应用程序目前已拆分为
我很难弄清楚我需要如何构建依赖注入和UoW传递以保持事情的合理性和可测试性。
我期待以下内容成为一个例子:
public class SomeMVCController : Controller
{
private readonly IStoreFrontLogic _storeFrontLogic;
public SomeMVCController(IStoreFrontLogic storeFrontLogic)
{
_storeFrontLogic = storeFrontLogic;
var uow = new UnitOfWork(User);
_storeFrontLogic.UnitOfWork = uow;
}
public ActionResult SomeRequest()
{
var myViewModel = _storeFrontLogic.OffersForUser();
return View(myViewModel);
}
}
public class StoreFrontLogic : IStoreFrontLogic
{
public UnitOfWork unitOfWork;
public OffersModel OffersForUser()
{
//some logic taking into account the current user in the uow
var prevOrders = unitOfWork.OrdersRepo.GetUsersOrders();
// special offers logic
return specialOffers;
}
}
这看起来合情合理吗? 我不太热衷于在需要的时候将uow手动推入逻辑类的要求。有更明智的方法吗?
答案 0 :(得分:0)
正如我上面所说,如果没有特定的问题或特定的领域模型,这很难回答,但我会试一试。
我对这些事情的理解主要集中在领域驱动设计镜头上。
首先,您应该阅读effective aggregate design上的这一系列论文。您需要工作单元并从域类中进行查询这一事实意味着您的模型需要工作。
关于UOW的一些其他想法 - 让uow产生你的存储库是好的,但我认为你可能会开始在实现方面遇到很多困难。 UoW在小目标区域非常有用,但在整个应用程序中很难实现。例如,当你保存时会发生什么?你能不直接使用EF吗?一切线程安全吗?您可能希望简化您要实现的目标。
在你的例子中,uow可以作为HttpRequest的范围。许多IoC容器(例如Structuremap)提供了一种简单的配置方法。然后,您可以使用操作后过滤器(甚至更好的OWIN模块)来尝试提交(如果存在错误,则会发生另一个实现难点)。这将消除很多属性赋值无意义的
我不确定你的StoreFrontLogic
是什么类型的对象。它看起来不像域实体,但它包含重要的业务逻辑。它可能类似于事务脚本,但在这种情况下,uow应该完全是内部的。
这是无国籍的服务吗?在这种情况下,该方法使用的所有内容 - 包括用户的订单 - 应该通过参数传递。
另一方面,如果它是一个实体,那么它根本不应该访问数据库,它应该已经拥有用户的所有订单。有目的的数据库非规范化可以在这里帮助很多。
至少将uow作为OffersForUser
的参数,而不是期望设置属性。