我正在研究.NET Core 2,但我不喜欢如何管理DI ...在网络上,我读到以下内容:
创建类似IService的界面
为IService创建实现
将它在.NET Core容器的范围内添加到解决依赖关系的Startup.Configuration方法中。
最后,我可以将其用于自定义控制器的构造函数中。
在.NET classic中,我使用了专用的XML配置文件来管理依赖关系:是否可以使用配置文件(JSON或XML相同)来执行与Startup.Configuration方法相同的操作?
...否则有人可以向我解释为什么将服务配置为Startup.Configuration是更好的方法吗?
非常感谢...
答案 0 :(得分:4)
首先,要回答您的问题“我可以使用配置文件”,答案是“是”。您稍后为什么不回答,但是现在,这是一个穷人版本,您可以通过添加到appsettings.json
文件中来实现此目的。请注意,该代码不是最佳代码,但旨在向您展示如何可以实现该解决方案。
让我们从一些用于保存数据的类开始:
public class ServicesConfiguration
{
public IEnumerable<ServiceItem> Singleton { get; set; }
public IEnumerable<ServiceItem> Transient { get; set; }
}
public class ServiceItem
{
public string Service { get; set; }
public string Implementation { get; set; }
}
现在在您的JSON文件中添加一个部分,您甚至可能希望将此文件保留在主配置外部,但这是实现细节,我将留给您:
{
//snip main config....
"Services" : {
"Singleton": [
{
"Service": "YourNamespace.IFoo1, YourNamespace",
"Implementation": "YourNamespace.Foo1, YourNamespace"
},
{
"Service": "YourNamespace.IFoo2, YourNamespace",
"Implementation": "YourNamespace.Foo2, YourNamespace"
}
],
"Transient": [
{
"Service": "YourNamespace.IBar1, YourNamespace",
"Implementation": "YourNamespace.Bar1, YourNamespace"
}
]
}
}
现在是一种扩展方法来配置所有功能:
public static IServiceCollection AddFromConfigurationFile(this IServiceCollection services,
IConfigurationSection configuration)
{
var servicesConfiguration = configuration.Get<ServicesConfiguration>();
foreach(var service in servicesConfiguration.Singleton)
{
services.AddSingleton(Type.GetType(service.Service), Type.GetType(service.Implementation));
}
foreach(var service in servicesConfiguration.Transient)
{
services.AddTransient(Type.GetType(service.Service), Type.GetType(service.Implementation));
}
//Other scopes here...
return services;
}
像这样在ConifigureServices
中调用它:
services.AddFromConfigurationFile(Configuration.GetSection("Services"));
那么,简单好吧?你为什么不这样做呢?一些想法浮出水面:
我确定还有更多,但这是您的应用!