zoukankan      html  css  js  c++  java
  • Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it has already been disposed.

    2019-07-24 11:09:15.231+08:00 LISA.Common.Utilities.LogUtil -
    System.ObjectDisposedException: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it has already been disposed.
    at Autofac.Core.Lifetime.LifetimeScope.CheckNotDisposed()
    at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
    at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)
    at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters)
    at Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context, IEnumerable`1 parameters)
    at LisaContainer.Resolve[T]() in C: epositoryEdenredLISA_6.0.0.0LISACoreLISA.CMSWebLISA.CMSWebApp_CodeLisaContainer.cs:line 29
    at LISA.InternalService.Client.ServiceFactory.GetFileUploadContract() in C: epositoryEdenredLISA_6.0.0.0LISACoreLISA.InternalService.ClientServiceFactory.cs:line 175
    at LISA.Fileupload.UploadBroker.get_Instance() in C: epositoryEdenredLISA_6.0.0.0LISACoreLISA.FileuploadFileUploadBrokerFactory.cs:line 39
    at LISA.Fileupload.FileUploadBrokerFactory.get_IFileUploadBroker() in C: epositoryEdenredLISA_6.0.0.0LISACoreLISA.FileuploadFileUploadBrokerFactory.cs:line 27

     

    autofac with asp.net webforms Instances cannot be resolved and nested lifetimes cannot be

    Autofac does its session disposal through an HttpModule called Autofac.Integration.Web.ContainerDisposalModule.

    You need to either

    • Put your own session cleanup in a module that is run before the container disposal. This can be a problem as the order of HttpModules is not guaranteed.

    OR

    • Remove the Container disposal HttpModule from the web.config and do your own lifetime scope cleanup in your Application EndRequest
    private void Application_EndRequest(object sender, EventArgs e)
    {
        ISession session = ContainerProvider.RequestLifetime.Resolve();
        //cleanup transaction etc...
        ContainerProvider.EndRequestLifetime();     
    }

    OR

    • Create a session manager class that is IDisposable and lifetime scoped, take your ISession as a constructor dependency and do your session cleanup when it is Disposed at the end of the lifetime.
    
        public class SessionManager : IDisposable
        {
            private readonly ISession _session;
            private ITransaction _transaction;
    
            public SessionManager(ISession session)
            {
                _session = session;
            }
    
            public void BeginRequest()
            {
                _transaction = _session.BeginTransaction();
            }
    
            #region Implementation of IDisposable
    
            /// 
            /// Dispose will be called automatically by autofac when the lifetime ends
            /// 
            public void Dispose()
            {
                //commit rollback, whatever
                _transaction.Commit();
            }
    
            #endregion
        }
    

    You must make sure to initialize your session manager.

    
        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            SessionManager manager = _containerProvider.RequestLifetime.Resolve();
            manager.BeginRequest();
        }
    
  • 相关阅读:
    Golang Gin 实战(一)| 快速安装入门
    6 款最棒的 Go 语言 Web 框架简介
    Golang教科书般的web框架
    vgo简明教程
    go mod常用命令 已经 常见问题
    线程池原理讲解 Java专题
    Python 3.9安装与使用
    消息队列的基本概念
    实践——GIT安装(2021/05/01)
    vue2.0数据双向绑定原理分析及代码实现
  • 原文地址:https://www.cnblogs.com/chucklu/p/11236958.html
Copyright © 2011-2022 走看看