使用延迟初始化的生命周期范围?

时间:2016-03-24 15:09:19

标签: c# asp.net-mvc dependency-injection autofac lazy-initialization

我找不到任何关于如何将Autofac与Lazy和生命周期范围一起使用的文档。收到关于

的错误
  

“范围内不会显示带有匹配'事务'的标记的范围   其中请求实例......“

在我的Controller构造函数中:

public HomeController(Lazy<ISalesAgentRepository> salesAgentRepository, Lazy<ICheckpointValueRepository> checkpointValueRepository)
{

       _salesAgentRepository = new Lazy<ISalesAgentRepository>(() => DependencyResolver.Current.GetService<ISalesAgentRepository>());
       _checkpointValueRepository = new Lazy<ICheckpointValueRepository>(() => DependencyResolver.Current.GetService<ICheckpointValueRepository>());
}

在我的行动中:

using (var transactionScope = AutofacDependencyResolver.Current.ApplicationContainer.BeginLifetimeScope("transaction"))
{
   using (var repositoryScope = transactionScope.BeginLifetimeScope())
   {
         // ....
   }
}

生命范围是否与Lazy不兼容,还是我完全错了?

1 个答案:

答案 0 :(得分:5)

是的,你正在咆哮错误的树。

为每个新的应用程序请求创建一个新的控制器。因此,无需单独尝试管理依赖项的生命周期。

将您的存储库配置为具有作用域生存期。对事务范围执行相同操作。

完成后,两个存储库将具有相同的共享transactionScope。

您还可以将事务提交移动到动作过滤器,如下所示:

public class TransactionalAttribute : ActionFilterAttribute
{
    private IUnitOfWork _unitOfWork;

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.Controller.ViewData.ModelState.IsValid && filterContext.HttpContext.Error == null)
            _unitOfWork = DependencyResolver.Current.GetService<IUnitOfWork>();

        base.OnActionExecuting(filterContext);
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Controller.ViewData.ModelState.IsValid && filterContext.HttpContext.Error == null && _unitOfWork != null)
            _unitOfWork.SaveChanges();

        base.OnActionExecuted(filterContext);
    }
}

(用transactionscope替换IUnitOfWork)。资料来源:http://blog.gauffin.org/2012/06/05/how-to-handle-transactions-in-asp-net-mvc3/