Register multiple dbcontext using autofac
我们在具有autofac IOC容器的DDD体系结构的asp.net MVC中进行了应用。 我们正在尝试使用不同的数据库连接注册两个dbcontext。 但是最后一个才生效。 我们正在使用Entity Framework 4.4.0。 这是代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | var masterDataSettingManager = new SaasDataSettingManager(); if (masterDataSettingManager.LoadSettings() != null) { var masterProviderSettings = masterDataSettingManager.LoadSettings(); builder.Register(c => masterDataSettingManager.LoadSettings()).As<DataSettings>(); builder.Register(x => new EfDataProviderManager(x.Resolve<DataSettings>())).As<BaseDataProviderManager>().InstancePerDependency(); builder.Register(x => (IEfDataProvider)x.Resolve<BaseDataProviderManager>().LoadDataProvider()).As<IDataProvider>().InstancePerDependency(); builder.Register(x => (IEfDataProvider)x.Resolve<BaseDataProviderManager>().LoadDataProvider()).As<IEfDataProvider>().InstancePerDependency(); if (masterDataSettingManager != null && masterProviderSettings.IsValid()) { var efDataProviderManager = new EfDataProviderManager(masterDataSettingManager.LoadSettings()); var dataProvider = (IEfDataProvider)efDataProviderManager.LoadDataProvider(); dataProvider.InitConnectionFactory(); var dbProviderFactory = efDataProviderManager.LoadDbProviderFactories(); builder.Register<IDbContext>(c => new MyDbContext1(masterProviderSettings.DataConnectionString, dbProviderFactory)).InstancePerHttpRequest(); } else { builder.Register<IDbContext>(c => new MyDbContext1(masterDataSettingManager.LoadSettings().DataConnectionString)).InstancePerHttpRequest(); } } //data layer var dataSettingsManager = new DataSettingsManager(); var dataProviderSettings = dataSettingsManager.LoadSettings(); builder.Register(c => dataSettingsManager.LoadSettings()).As<DataSettings>(); builder.Register(x => new EfDataProviderManager(x.Resolve<DataSettings>())).As<BaseDataProviderManager>().InstancePerDependency(); builder.Register(x => (IEfDataProvider)x.Resolve<BaseDataProviderManager>().LoadDataProvider()).As<IDataProvider>().InstancePerDependency(); builder.Register(x => (IEfDataProvider)x.Resolve<BaseDataProviderManager>().LoadDataProvider()).As<IEfDataProvider>().InstancePerDependency(); if (dataProviderSettings != null && dataProviderSettings.IsValid()) { var efDataProviderManager = new EfDataProviderManager(dataSettingsManager.LoadSettings()); var dataProvider = (IEfDataProvider)efDataProviderManager.LoadDataProvider(); dataProvider.InitConnectionFactory(); var dbProviderFactory = efDataProviderManager.LoadDbProviderFactories(); builder.Register<IDbContext>(c => new MyDbContext2(dataProviderSettings.DataConnectionString, dbProviderFactory)).InstancePerHttpRequest(); } else { builder.Register<IDbContext>(c => new MyDbContext2(dataSettingsManager.LoadSettings().DataConnectionString)).InstancePerHttpRequest(); } builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>)).InstancePerHttpRequest(); |
像这样注册他们:
1 2 3 4 5 6 7 8 | builder .Register(c => new MyDbContext1(dataProviderSettings.DataConnectionString, dbProviderFactory)) .Named<IDbContext>("dbContext1").InstancePerHttpRequest(); builder .Register(c => new MyDbContext2(dataProviderSettings.DataConnectionString, dbProviderFactory)) .Named<IDbContext>("dbContext2").InstancePerHttpRequest(); |
然后解决它们:
1 | IDbContext dbContext = ctx.ResolveNamed<IDbContext>("dbContext1"); |
如果您想将其注入构造函数中,则可以这样进行:
1 2 3 4 5 6 | builder .RegisterType<SomeService>() .WithParameter( (p, c) => p.Name =="dbContext", (p, c) => c.ResolveNamed<IDbContext>("dbContext1") ); |
除了具有命名注册pf dbContext之外,您仍然可以与它们并行定义未命名-可以将其视为默认名称。 然后,在您的应用程序中,您宁愿使用命名注册,然后以上述方式指定此需求。