所以我一直在使用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尚不支持。
答案 0 :(得分:1)
当我有多个客户端(例如A,B和C)时,我将基于不同的代理和环境创建不同的JSON文件:
A.Development.json
,A.Staging.json
,A.Production.json
B.Development.json
,B.Staging.json
,B.Production.json
C.Development.json
,C.Staging.json
,C.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;
}
}
我不太确定这是否是一个好习惯,但是到目前为止,这是我为不同的客户端和环境配置应用程序的方式。希望这种方法可以帮助您找到更好的解决方案。 (我认为会有更好的方法来做到这一点)