Can't inject a delegate using ASP.NET Core DI

2019-06-12 15:14发布

Say I've a MVC Core Controller like this:

public class SomeController
{
     public SomeController(IConfiguration appConfig, Func<string> someDelegate)
     {
     }
}

Also, I'm using AutoFac to resolve injections. Object injections are working flawlessly while adding a delegate injection produces an ASP.NET Core exception which tells that Func<string> can't be injected because there's no component to inject with such type.

When I try to manually resolve SomeController using AutoFac I get the desired behavior.

Is there any way to support this scenario without using AutoFac to resolve controllers?

1条回答
Ridiculous、
2楼-- · 2019-06-12 15:44

Controllers are not resolved via DI by default, they are constructed in the DefaultControllerFactory or so.

Update

Microsoft.Extensions.DependencyInjection doesn't support named components, discovery, auto registrations, decorators etc.

It's meant to be simple out of the box IoC and provide the base for DI for basic applications and offer easy way for 3rd party IoC containers (with advanced features such as auto discovery, decorators etc.) to be integrated (basically all they need is process the information in IServiceCollection and return their own implementation of IServiceProvider from Configure method).

Tag helpers, controllers and view components are different in this aspect as they have their own activators (the default one use activation utilities, which at some point further down the pipeline use the service provider). For that reasons AddControllersAsServices exists, because it replaces DefaultControllerActivator (which uses ActivationUtilities, see DefaultControllerActivator.cs) with ServiceBasedActivator (which uses IServiceProvider, see ServiceBasedControllerActivator).

Also see this related answer for details on how to resolve controllers, tag helpers and view components via DI.

var builder = services
    .AddMvc()
    .AddControllersAsServices() // this one for your case
    .AddViewComponentsAsServices()
    .AddTagHelpersAsServices();
查看更多
登录 后发表回答