你应该把工作单元包起来吗?

时间:2014-02-25 16:43:57

标签: c# asp.net-mvc entity-framework

我一直在尝试教育自己整个EF / Repository / Unit of Work架构 - 它进展缓慢。

无论如何,我已经设法创建了一些使用接口的存储库和一个工作单元。 (花了我一个小时的时间让它在没有完美工作的情况下使用界面。)

正确..问题。在这里包装工作单元有什么意义吗?

private readonly IUnitOfWork _unitOfWork;

public ActionResult Index()
{
    var all = _unitOfWork.CampaignRepository.All().ToList();
    return View(all);            
}

或者

public ActionResult Index()
{
    using (var uow = _unitOfWork)
    {
        all = uow.CampaignRepository.All().ToList();
        return View(all);
    }
}

此外 - 它在控制器中实例化

public CampaignController(MarketingContext context)
{
    _unitOfWork = new UnitOfWork(context);
}

这是否意味着控制器内的始终可用?或者只有在专门调用工作单元时?

对不起任何天真,但我一直在阅读这么多不同的做法!

2 个答案:

答案 0 :(得分:0)

首先,当您使用实体框架时,您不需要实现UnitOfWork模式,因为默认情况下EF支持UOF。(EF支持UOF的SaveChanges) 现在,如果你想实现UnitOfWork,不要使用ToList()来获取存储库的所有实体,因为无论何时调用控制器都不需要对数据进行操作(这是性能问题),为了更好UnotOfWork和Repository模式的实现看一下this文章。

答案 1 :(得分:0)

我永远不会在using语句中包含一个字段,因为那时字段可以想象在其他地方的范围内,但已经处理掉了。通常,您应该在using子句中实例化一次性对象:

   using(var scope = new TransactionScope())
   {
      //etc
   }

覆盖控制器中的Dispose方法并在你的UOW上调用dispose:

   protected override void Dispose(bool disposing)
   {
       if (disposing)
           _unitOfWork.Dispose();
        base.Dispose(disposing);
   }

或者您可以按照elolos评论

中的建议在IoC容器中指定范围