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 中提炼出来。