添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

初学Autofac对生命周期不熟悉.

问题是这样的:

当我使用 InstancePerLifetimeScope 注册时在 TestServer 服务中 使用 RepositoryContext 和 UnitOfWork 是同一个对象 。这个服务正常. 但其他的服务(MenuServer、CatalogServer)使用 RepositoryContext 和 UnitOfWork 抛出异常:数据库链接已关闭.

原因是请求 一个页面 调用多个服务 他用的 RepositoryContext 和 UnitOfWork 还是之前使用过的对象。但链接被关了 所以抛出异常:数据库链接已关闭.

然后我改成 InstancePerDependency (对每一个依赖或每一次调用创建一个新的唯一的实例) 注册时。
TestServer 服务中使用了 UnitOfWork 跨服务事务提交。结果还是抛出异常: 事务不是与当前连接无关联,就是已完成。

现在不知道怎么弄了请各位赐教.

 public void Registrar(ContainerBuilder builder, ITypeFinder typeFinder)
        {// 注册仓库
            builder.RegisterType<RepositoryContext>().As<IRepositoryContext>().InstancePerLifetimeScope();
            builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerLifetimeScope();
            builder.RegisterGeneric(typeof(Reprtory<>)).As(typeof(IReprtory<>)).InstancePerLifetimeScope();
            // 服务注册
            builder.RegisterType<CustomerServer>().As<ICustomerServer>().PropertiesAutowired().InstancePerLifetimeScope();// 注册客户业务
            builder.RegisterType<MenuServer>().As<IMenuServer>().PropertiesAutowired().InstancePerLifetimeScope();// 注册菜单
            builder.RegisterType<CatalogServer>().As<ICatalogServer>().PropertiesAutowired().InstancePerDependency();// 注册商品目录
            builder.RegisterType<TestServer>().As<ITextServer>().PropertiesAutowired().InstancePerLifetimeScope();//测试
            builder.RegisterType<Test1Server>().As<ITextServer1>().PropertiesAutowired().InstancePerLifetimeScope();//测试1
 public class TestServer : Reprtory<Test>, ITextServer
        public TestServer(IRepositoryContext context,
                          IUnitOfWork unitOfWork
                        ): base(context, unitOfWork){
        public void t()
            Test t1= new Test() { Name = "0aasfd35", Value = 31 };
            Test1 t2 = new Test1() { Name = "122343", Value = 33300 };
                UnitOfWork.BeginTran();
                var e = GetById(1);
                Inser(t1);
                Test1Server x1 = new Test1Server(Context, UnitOfWork);
                x1.t();
                UnitOfWork.Commit();
            catch (Exception)
                UnitOfWork.Rollback();
    public class Test1Server : Reprtory<Test1>, ITextServer1
        public Test1Server(IRepositoryContext context,
                          IUnitOfWork unitOfWork
            : base(context, unitOfWork) { }
        public void t()
            Test1 o1 = new Test1() { Name = "0", Value = 1 };
            Test1 o2 = new Test1() { Name = "123", Value = 1000 };
            Inser(o1);
            Inser(o2);
  public class RepositoryContext : DisposableObject, IRepositoryContext
        public RepositoryContext()
            InitConnection();
        private IDbConnection _dbConnection;
        public IDbConnection DbConnection { get { return  _dbConnection; } }
        /// <summary>
        /// 初始化
        /// </summary>
        public void InitConnection()
            if (this._dbConnection == null)
                this._dbConnection = new SqlConnection(ConfigSettings.DBconnectionString);
            if (this._dbConnection.State == ConnectionState.Closed)
                this._dbConnection.Open();
        protected override void Dispose(bool disposing)
            if (!disposing) return;
            if (this._dbConnection.State != ConnectionState.Open) return;
            this._dbConnection.Close();
            this._dbConnection.Dispose();
            IRepositoryContext _repositoryContext = null;
            builder.Register(c => {
                _repositoryContext = new RepositoryContext();
                return _repositoryContext;
            }).As<IRepositoryContext>().InstancePerDependency();
            builder.Register(c => {
                var unitOfWork = new UnitOfWork(_repositoryContext);
                return unitOfWork;
            }).As<IUnitOfWork>().InstancePerLifetimeScope();