如何为特定的接口类型注册DI服务?

时间:2018-02-06 10:22:03

标签: c# reflection dependency-injection asp.net-core .net-core

我有interface IServiceHandlerAsync<T>我有以下服务注册

services.AddScoped<SoftwareTestService>();
services.AddScoped<SoftwareTestCaseService>();
services.AddScoped<SoftwareTestCaseStepService>();
services.AddScoped<SoftwareTestCaseStepResultService>();

其中每个服务都继承自interface IServiceHandlerAsync<T>

是否有可能通过使用界面来解析和注册未提及的服务而无需明确指定每个服务(我认为反射可能会起作用)?

算法示例将是

foreach (var service in .getResolvedServices<IServiceHandlerAsync>)
{
    services.AddScoped(service);
}

2 个答案:

答案 0 :(得分:2)

我最终得到了以下解决方案。

System.Reflection.Assembly.GetExecutingAssembly().GetTypes().Where(mytype => mytype.GetInterface(typeof(IServiceHandlerAsync<>).Name) != null)
            .ForEach(appCoreService => services.AddScoped(appCoreService));

感谢您的时间

答案 1 :(得分:0)

快速回答:否

答案很长:不 - 不使用Microsoft.Extensions.DependencyInjection.Abstractions开箱即用的功能。这些软件包提供了非常基本的功能,最初是为了使用早期版本的dotnet标准(如1.1 - ~1.5)而构建的,它几乎不包含任何反射功能。因此,它们强制您以明确的方式声明您的依赖项:

   services.AddScoped<SoftwareTestService>();
   services.AddScoped<SoftwareTestCaseService>();
   services.AddScoped<SoftwareTestCaseStepService>();
   services.AddScoped<SoftwareTestCaseStepResultService>();

对我来说,一个更重要的问题是 - 如果你注册了IServiceHandlerAsync界面的多个实现,你如何决定你将获得/需要哪一个?

您看到IServiceprovider.GetService<IServiceHandlerAsync>只返回其中一个(并且没有说明您注册的4个中的哪一个),而IServiceprovider.GetServices<IServiceHandlerAsync>将返回所有这些,让你完成整理你需要哪一个的任务 - 这正是依赖注入应该从你肩膀上消失的东西。