![](/img/trans.png)
[英]ASP.NET Core DI with Simple Injector sharing DbContext
[英]How to register two configurations that map to the same type in DI injector in ASP.NET Core
假設我們有兩個連接字符串 - 這只是一個示例,無論我在配置什么,我都在尋找一種更好的方法來實現它 - 在 appSettings.json 文件中:
"ImportDb": {
"StringConexao": "data source=server_n1;initial catalog=MyImportDb;user id=SYSDBA;password=masterkey;Charset=UTF8;",
"BooleanProperty": false
},
"MainDb": {
"StringConexao": "data source=server_n1;initial catalog=MyMainDb;user id=SYSDBA;password=masterkey;Charset=UTF8;",
"BooleanProperty": false
},
今天,我解決了映射到 2 種不同類型的問題:
public class DbConfig
{
public string StringConexao { get; set; }
public bool BooleanProperty { get; set; }
}
public class LocalDbConfig: DbConfig
{
}
並像這樣在 DI 中注冊:
serviceCollection.Configure<DbConfig>(DadosConfig.GetSection("MainDb"));
serviceCollection.Configure<LocalDbConfig>(DadosConfig.GetSection("ImportDb"));
為什么我這樣解決:
它有一些缺點:
所以我問:有一種更“優雅”的方式來進行這種映射嗎?
免責聲明:
user id=SYSDBA;password=masterkey
是 FirebirdSQL 數據庫服務器的默認登錄名/密碼。 多年來眾所周知。我嘗試創建一個 someservicefactory 來創建具有不同配置的服務,如下所示:
public interface IDbconfig
{
public string StringConexao { get; set; }
public bool BooleanProperty { get; set; }
}
public class DbConfig: IDbconfig
{
public string StringConexao { get; set; }
public bool BooleanProperty { get; set; }
}
public interface IService
{
public string Test { get; set; }
public string Test1 { get; set; }
}
public class Service: IService
{
public string Test { get; set; }
public string Test1 { get; set; }
public Service(List<DbConfig> config)
{
this.Test = config.First().StringConexao;
this.Test1 = config.Last().StringConexao;
}
}
public interface IServiceFactory
{
IServiceFactory Add(string key);
IService Create(string key);
}
public class ServiceFactory : IServiceFactory
{
private readonly IConfiguration _configuration;
private readonly Dictionary<string, IService> _someservices = new Dictionary<string, IService>();
public ServiceFactory(IConfiguration configuration)
{
_configuration = configuration;
this.Add ("MainDb").Add("ImportDb").Add("MainDb,ImportDb");
}
public IServiceFactory Add(string key)
{
var keystringlist = key.Split(",").ToList();
var configs = new List<DbConfig>();
foreach(var newkey in keystringlist)
{
var config = new DbConfig();
_configuration.GetSection(newkey).Bind(config);
configs.Add(config);
}
var someservice = new Service(configs);
_someservices.Add(key, someservice);
return this;
}
public IService Create(string keyOfConfiguration)
{
return _someservices[keyOfConfiguration];
}
}
在startup.cs中:
services.AddSingleton<IServiceFactory, ServiceFactory>();
將工廠注入 controller 或其他地方,並使用不同的配置創建服務:
var service1 = _serviceFactory.Create("ImportDb");
var service2 = _serviceFactory.Create("MainDb");
var service3 = _serviceFactory.Create("MainDb,ImportDb");
結果:
您說列表不行,因為您需要在構造函數中處理正確的數據庫,但您可以使用字典。 您可以定義一個 class DbConfigs:
public class DBConfigs
{
public Dictionary<string, DBConfig> DBConfigurations { get; set; }
}
然后在 apSettings 你可以有:
"DBConfigs": {
"DBConfigurations": {
"ImportDb": {
"StringConexao": "data source=server_n1;initial catalog=MyImportDb;user id=SYSDBA;password=masterkey;Charset=UTF8;",
"BooleanProperty": false
},
"MainDb": {
"StringConexao": "data source=server_n1;initial catalog=MyMainDb;user id=SYSDBA;password=masterkey;Charset=UTF8;",
"BooleanProperty": false
}
}
}
在 DI 中的注冊變為:
serviceCollection.Configure<DbConfigs>(DadosConfig.GetSection("DBConfigs"));
最后,您可以用這種方式扭曲您的構造函數:
public MyClass(DBConfig aConfig)
{
_myConfig = aConfig.DBConfigurations["MainDB"];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.