Microsoft.Extensions.DependencyInjection 自动解析对象依赖关系
Microsoft.Extensions.DependencyInjection auto resolve objects dependencies
之前我使用 Unity 进行依赖注入,它自动为我解决了依赖,代码看起来像这样:
IUnityContainer UnityContainer = new UnityContainer();
UnityContainer.RegisterType<IDataProvider, DataProvider>();
一些 class 要 IDataProvider
注入:
public class SomeClass
{
private IDataProvider dataProvider;
public SomeClass(IDataProvider dataProvider)
{
this.dataProvider = dataProvider;
}
}
要统一解决此对象的依赖关系,我可以简单地键入
SomeClass myClass = Unity.Resolve<SomeClass>();
并且它会自动尝试从其 ServiceCollection 中注入所需的构造函数参数。由于 Unity 现在贬值,我一直在尝试切换到 Microsoft.Extensions.DependencyInjection,我已经设置了 IServiceProvider 并且可以 return 请求服务,但是我还没有弄清楚如何使用这个库(如果我需要额外的库来实现这个功能)达到同样的结果。
MS.DI 不支持此功能,它包含 不 允许您添加此功能的挂钩MS.DI 之上的功能。如果您选择坚持使用 MS.DI,则必须在容器中显式或使用 Auto-Registration 注册 SomeClass
;没有办法解决这个问题。
显式注册意味着您对每个要注册的 class 都有一行代码,例如:
services.AddTransient<SomeClass>();
另一方面,对于 Auto-Registration,您应用 Convention over Configuration 并使用反射在运行时查找类型。例如:
var types =
from type in typeof(SomeClass).Assembly.GetTypes()
// Define your convention here
where typeof(ISomeInterface).IsAssignableFrom(type)
where ...
select type;
foreach (Type type in types)
{
services.AddTransient(type, type);
}
Auto-Registration
的规模比 Explicit Register
方法好得多。但是,这确实需要某种约定,可以从您希望使用反射注册的 classes 中提炼出来。
之前我使用 Unity 进行依赖注入,它自动为我解决了依赖,代码看起来像这样:
IUnityContainer UnityContainer = new UnityContainer();
UnityContainer.RegisterType<IDataProvider, DataProvider>();
一些 class 要 IDataProvider
注入:
public class SomeClass
{
private IDataProvider dataProvider;
public SomeClass(IDataProvider dataProvider)
{
this.dataProvider = dataProvider;
}
}
要统一解决此对象的依赖关系,我可以简单地键入
SomeClass myClass = Unity.Resolve<SomeClass>();
并且它会自动尝试从其 ServiceCollection 中注入所需的构造函数参数。由于 Unity 现在贬值,我一直在尝试切换到 Microsoft.Extensions.DependencyInjection,我已经设置了 IServiceProvider 并且可以 return 请求服务,但是我还没有弄清楚如何使用这个库(如果我需要额外的库来实现这个功能)达到同样的结果。
MS.DI 不支持此功能,它包含 不 允许您添加此功能的挂钩MS.DI 之上的功能。如果您选择坚持使用 MS.DI,则必须在容器中显式或使用 Auto-Registration 注册 SomeClass
;没有办法解决这个问题。
显式注册意味着您对每个要注册的 class 都有一行代码,例如:
services.AddTransient<SomeClass>();
另一方面,对于 Auto-Registration,您应用 Convention over Configuration 并使用反射在运行时查找类型。例如:
var types =
from type in typeof(SomeClass).Assembly.GetTypes()
// Define your convention here
where typeof(ISomeInterface).IsAssignableFrom(type)
where ...
select type;
foreach (Type type in types)
{
services.AddTransient(type, type);
}
Auto-Registration
的规模比 Explicit Register
方法好得多。但是,这确实需要某种约定,可以从您希望使用反射注册的 classes 中提炼出来。