簡體   English   中英

如何將 map 的兩個配置注冊到 ASP.NET 內核的 DI 注入器中的相同類型

[英]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"));

為什么我這樣解決:

  • 兩種配置具有完全相同的屬性。 它們僅在使用哪個 class 上有所不同。
  • 在上述字符串連接的情況下,這兩個配置甚至可以引用兩個不同網絡上的不同服務器。
  • 我不能將它們視為一個列表(我需要能夠在構造函數上解決一個或另一個)

它有一些缺點:

  • 由於這兩種類型是后代,如果某些要求發生變化並且使用其中一種配置的 class 也需要接受另一種配置,我不能為每種類型的 DbConfig 分別設置兩個構造函數 - 它會混淆 DI 注入器。

所以我問:有一種更“優雅”的方式來進行這種映射嗎?

免責聲明:

  • user id=SYSDBA;password=masterkey是 FirebirdSQL 數據庫服務器的默認登錄名/密碼。 多年來眾所周知。
  • 對於那些好奇的人來說,“StringConexao”的意思是“ConnectionString”。

我嘗試創建一個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM