带配置文件的Dot Net Core中的IoC / DI

时间:2018-12-22 22:54:47

标签: .net-core asp.net-core-2.0

所以我一直在使用Dot Net Core。 我让IoC / DI使用“编码器升级”。

我发现“ By Environment”功能可以调整。

当您需要...环境...进行微调时,“按环境”效果很好。

不起作用的是“客户”对DI的需求不同。

假设我有一个产品。其目标是与客户的数据库对话,而每个客户的数据库完全不同。

我想将该数据转换为“标准”。

(这是一个示例示例,顺便说一句)。

我要编写一个接口:ICustomersDataAdapter

我会写一个

AcmeAdapter:ICustomersDataAdapter

MomAndPopsShopAdapter:ICustomersDataAdapter

(等,等等)

对于Microsoft Unity,当我使用xml的配置来部署代码(每个客户位于不同的位置)时,更换不同的客户端适配器非常简单。
这不是“按环境”,因为我所有的客户都具有开发,登台和生产环境。

有人用DI解决了这种IoC / DI的问题,并且不涉及诸如此类的骇人听闻的东西

enc.IsEnvironment(“ AcmeProduction”),在这里我混合/合并了不同客户和环境的关注点。 (<< BOO)

DotNetCore可以通过许多不同的方式进行深思熟虑。

但是这个,不确定如何被忽略。


https://asp.net-hacker.rocks/2018/09/27/customizing-aspnetcore-03-dependency-injection.html

  

也许您想在配置文件中配置服务   在应用程序外部,在XML或JSON文件中,而不是仅在C#中

     

这是各种DI容器中的常见功能,但ASP.NET Core尚不支持。

1 个答案:

答案 0 :(得分:1)

当我有多个客户端(例如A,B和C)时,我将基于不同的代理和环境创建不同的JSON文件:

  • A.Development.jsonA.Staging.jsonA.Production.json
  • B.Development.jsonB.Staging.jsonB.Production.json
  • C.Development.jsonC.Staging.jsonC.Production.json

在每个JSON文件中,它看起来像

{
  "adapter" : "acme" // it can be "acme" or "momAndPopsShop", based on requirement
}

然后我将在Environment Variables中创建一个名为“ client_id”的参数。

通过以上配置,在Program.cs中,我可以同时知道“客户端”和“环境”:

var clientId = Environment.GetEnvironmentVariable("client_id");  // clientId will be A,B or C
var env = hostingContext.HostingEnvironment;
var settingFile = $"{clientId}.{env}.json";  // the exact client & env

// config is IConfigurationBuilder
config.AddJsonFile("appsettings.json", true, true) // add default app settings
      .AddJsonFile(settingFile, true, true); // add customized client settings   

到目前为止,我已经为客户端和环境添加了自定义设置。接下来,在DI部分中,我将读取IConfiguration并根据设置注入相应的服务。

public class Startup
{
    public IConfiguration Configuration { get; }

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        ....

        services.ConfigureDatabase(Configuration);
    }

    ...
}

public static void ConfigureAdapter(this IServiceCollection services, IConfiguration configuration)
{
    var adapterType = configuration.GetSection("adapter").Value; // this value is read from A/B/C.env.json
    switch (adapterType)
    {
        case "acme":
            services.AddSingleton<ICustomersDataAdapter, AcmeAdapter>();
            break;
        case "momAndPopsShop":
            services.AddSingleton<ICustomersDataAdapter, MomAndPopsShopAdapter>();
            break;
        default:
            //log or throw error
            break;
     }
}

我不太确定这是否是一个好习惯,但是到目前为止,这是我为不同的客户端和环境配置应用程序的方式。希望这种方法可以帮助您找到更好的解决方案。 (我认为会有更好的方法来做到这一点)