C# ASP.NET核心DI错误:尝试激活时无法解析类型的服务-可选控制器构造函数

C# ASP.NET核心DI错误:尝试激活时无法解析类型的服务-可选控制器构造函数,c#,asp.net-core,dependency-injection,C#,Asp.net Core,Dependency Injection,我在尝试将注入服务激活到API控制器时收到此错误: System.InvalidOperationException: Unable to resolve service for type 'MyApp.Interfaces.IFooService' while attempting to activate 'MyApp.Controllers.FooController'. at Microsoft.Extensions.DependencyInjection.ActivatorUtil

我在尝试将注入服务激活到API控制器时收到此错误:

System.InvalidOperationException: Unable to resolve service for type 'MyApp.Interfaces.IFooService' while attempting to activate 'MyApp.Controllers.FooController'.
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
   at lambda_method(Closure , IServiceProvider , Object[] )
   at Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.<>c__DisplayClass4_0.<CreateActivator>b__0(ControllerContext controllerContext)
   at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass5_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
   at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
System.InvalidOperationException:尝试激活“MyApp.Controllers.FooController”时,无法解析类型“MyApp.Interfaces.IFooService”的服务。
位于Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp,类型类型,类型requiredBy,布尔值isDefaultParameterRequired)
在lambda_方法中(闭包、IServiceProvider、对象[])
在Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.c__显示Class4_0.b__0(ControllerContext ControllerContext)
在Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.c_uuDisplayClass5_0.g_uCreateController | 0(ControllerContext ControllerContext)
位于Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(状态和下一步、范围和范围、对象和状态、布尔值和isCompleted)
在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()中
在Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()上
位于Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext)
在Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State&Next、Scope&Scope、Object&State、Boolean&isCompleted)
在Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()中
在Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()上
在Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext HttpContext)中
位于Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext上下文)
我知道我为什么会犯这个错误。我在构建服务集合时有这样的逻辑,如果IsDisabled为true,则不会添加服务:

var fooServiceConfiguration = FooServiceConfigurationHelper<IFooService>.GetFooServiceConfiguration(Configuration);
            if (!fooServiceConfiguration.IsDisabled)
                services.AddTransient(s => ServiceHelper.GetService<IFooService>(fooServiceConfiguration));
var fooServiceConfiguration=FooServiceConfigurationHelper.GetFooServiceConfiguration(配置);
如果(!fooServiceConfiguration.IsDisabled)
services.AddTransient(s=>ServiceHelper.GetService(fooServiceConfiguration));
本质上,如果我们已经将服务配置为禁用,我试图做的是不将服务添加到集合中。这样做的原因是为了避免在配置设置(bool IsDisabled)中“关闭”服务及其依赖项时构建服务

但是控制器显然不知道服务没有创建,导致了这个错误

public MyApiController(ILogger<MyApiController> logger, IFooService fooService, IBarService barService)
public MyApiController(ILogger记录器、IFooService fooService、IBarService barService)
我试图找出是否有适合这种情况的最佳实践,无论是重载的控制器构造函数,还是其他什么。如果需要,我很乐意提供更多细节

本质上,我尝试做的不是将服务添加到 集合,如果我们已将其配置为禁用。原因是什么 是为了避免构建服务及其依赖项,如果我们 配置设置中的“关闭”(布尔值被禁用)


这是国际奥委会。你不应该那样做。它要么是该类的依赖项,要么不是。您可以破解它,但它会变成一个丑陋的反模式,需要处理null。这为类添加了逻辑,并使单元测试变得更加棘手。这篇文章更详细地讨论了这一点:

这很有意义。我想我只需要弄清楚如何使这些注入服务的构造成本更低,这样就不需要考虑服务配置中的if/then逻辑。谢谢你的文章链接。使用。不是注册它,而是注册一个空的实现(所谓的“Null对象”)。