C# 分层工作单元

C# 分层工作单元,c#,asp.net-mvc,unit-of-work,n-tier-architecture,C#,Asp.net Mvc,Unit Of Work,N Tier Architecture,我正在重构一个现有的MVC.Net应用程序,以包含工作单元模式,从而使数据管理更加明显和直接 应用程序当前分为以下几个部分: 演示/UI MVC控制器为AngularJS提供视图或JsonResults 包含良好的业务逻辑。。。业务逻辑 DAL存储库和EF 我很难弄清楚我需要如何构造依赖注入和UoW传递,以保持事情的合理性和可测试性 我期待下面这样的例子: public class SomeMVCController : Controller { private readonly ISt

我正在重构一个现有的MVC.Net应用程序,以包含工作单元模式,从而使数据管理更加明显和直接

应用程序当前分为以下几个部分:

演示/UI MVC控制器为AngularJS提供视图或JsonResults 包含良好的业务逻辑。。。业务逻辑 DAL存储库和EF 我很难弄清楚我需要如何构造依赖注入和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推送到我的逻辑类中。有没有更明智的方法?

正如我上面所说的,如果没有具体的问题或具体的领域模型,很难回答这个问题,但我会试一试

我对这些东西的理解主要是通过领域驱动的设计视角

首先,你应该阅读这一系列的文章。您需要工作单元并从域类内部执行查询这一事实意味着您的模型需要工作

关于UOW的其他一些想法——让UOW生成您的存储库是好的,但我认为您可能会在实现中遇到很多困难。UoW在小的目标区域非常有用,但很难在整个应用程序中实现。例如,保存时会发生什么情况?你不能直接使用EF吗?一切都是线程安全的吗?您可能希望简化您试图实现的目标

在您的示例中,uow的范围可以限定为HttpRequest。许多IoC容器(如Structuremap)提供了一种简单的配置方法。然后,您可以有一个操作后过滤器,或者更好的是一个OWIN模块来尝试提交。如果出现错误,会发生什么,这是另一个要处理的实现困难。这将消除许多关于财产转让的废话

我不确定你的StoreFrontLogic是什么类型的对象。它看起来不像域实体,但它包含重要的业务逻辑。它可能类似于事务脚本,但在这种情况下,uow应该完全位于它的内部

它是无状态服务吗?在这种情况下,该方法使用的所有内容(包括用户订单)都应该通过参数传入

另一方面,如果它是一个实体,那么它根本不应该访问数据库,它应该已经拥有用户的所有订单。有目的的数据库非规范化在这方面会有很大帮助


至少要将uow作为参数传递给OffersForUser,而不是期望设置属性。

您可能需要重新构造它,看看是否可以对设计模式提出具体问题。就目前情况而言,不可能真的有一个正确的答案。另一种可能性是实现一个原型并将其发布到codreview.stackexchange上