C# 具有延迟初始化的生存期范围?

C# 具有延迟初始化的生存期范围?,c#,asp.net-mvc,dependency-injection,autofac,lazy-initialization,C#,Asp.net Mvc,Dependency Injection,Autofac,Lazy Initialization,我找不到任何关于如何将Autofac与惰性作用域和生存期作用域一起使用的文档。得到一个关于 “从作用域中看不到标记与“transaction”匹配的作用域 在其中请求了实例…” 在我的控制器构造函数中: public HomeController(Lazy<ISalesAgentRepository> salesAgentRepository, Lazy<ICheckpointValueRepository> checkpointValueRepository) {

我找不到任何关于如何将Autofac与惰性作用域和生存期作用域一起使用的文档。得到一个关于

“从作用域中看不到标记与“transaction”匹配的作用域 在其中请求了实例…”

在我的控制器构造函数中:

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

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

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

是的,你找错了方向

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

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

完成后,两个存储库将具有相同的共享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);
    }
}
公共类TransactionalAttribute:ActionFilterAttribute { 私人工作单位; 公共覆盖无效OnActionExecuting(ActionExecutingContext filterContext) { if(filterContext.Controller.ViewData.ModelState.IsValid&&filterContext.HttpContext.Error==null) _unitOfWork=DependencyResolver.Current.GetService(); base.OnActionExecuting(filterContext); } 公共覆盖无效OnActionExecuted(ActionExecutedContext筛选器上下文) { if(filterContext.Controller.ViewData.ModelState.IsValid&&filterContext.HttpContext.Error==null&&u unitOfWork!=null) _unitOfWork.SaveChanges(); base.OnActionExecuted(filterContext); } }
(用transactionscope替换
IUnitOfWork
)。来源:

是的,你找错了方向

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

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

完成后,两个存储库将具有相同的共享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);
    }
}
公共类TransactionalAttribute:ActionFilterAttribute { 私人工作单位; 公共覆盖无效OnActionExecuting(ActionExecutingContext filterContext) { if(filterContext.Controller.ViewData.ModelState.IsValid&&filterContext.HttpContext.Error==null) _unitOfWork=DependencyResolver.Current.GetService(); base.OnActionExecuting(filterContext); } 公共覆盖无效OnActionExecuted(ActionExecutedContext筛选器上下文) { if(filterContext.Controller.ViewData.ModelState.IsValid&&filterContext.HttpContext.Error==null&&u unitOfWork!=null) _unitOfWork.SaveChanges(); base.OnActionExecuted(filterContext); } }
(用transactionscope替换
IUnitOfWork
)。来源:

如果是web api过滤器。从上下文中解析它<代码>过滤器上下文.Request.GetDependencyScope().GetService(类型为(IUnitOfWork))作为IUnitOfWork。否则,它将从根容器中解析,并且它将不是请求中的同一实例。因为WebAPI过滤器缓存了一种单例。如果是WebAPI过滤器。从上下文中解析它<代码>过滤器上下文.Request.GetDependencyScope().GetService(类型为(IUnitOfWork))作为IUnitOfWork。否则,它将从根容器中解析,并且它将不是请求中的同一实例。因为WebAPI过滤缓存的单例。