我一直在尝试教育自己整个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);
}
这是否意味着控制器内的始终可用?或者只有在专门调用工作单元时?
对不起任何天真,但我一直在阅读这么多不同的做法!
答案 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容器中指定范围