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?
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 ofIServiceProvider
fromConfigure
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 replacesDefaultControllerActivator
(which uses ActivationUtilities, see DefaultControllerActivator.cs) withServiceBasedActivator
(which usesIServiceProvider
, seeServiceBasedControllerActivator
).Also see this related answer for details on how to resolve controllers, tag helpers and view components via DI.