关于c#:无法使用ASP.NET Core DI注入委托

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

说我有一个像这样的MVC核心控制器:

1
2
3
4
5
6
public class SomeController
{
     public SomeController(IConfiguration appConfig, Func<string> someDelegate)
     {
     }
}

此外,我正在使用AutoFac解决注入问题。在添加委托注入时,对象注入可以完美地工作,从而产生一个ASP.NET Core异常,该异常表明无法注入Func<string>,因为没有组件可以使用这种类型进行注入。

当我尝试使用AutoFac手动解析SomeController时,得到了所需的行为。

是否有任何方法可以支持这种情况而无需使用AutoFac来解析控制器?


默认情况下,不会通过DI解析控制器,它们是在DefaultControllerFactory左右构造的。
更新

Microsoft.Extensions.DependencyInjection不支持命名组件,发现,自动注册,装饰器等。

这意味着开箱即用的IoC很简单,并且为基本应用程序提供了DI的基础,并且为集成第三方(具有自动发现,装饰等高级功能的IoC容器)提供了简便的方法。他们需要处理IServiceCollection中的信息,并从Configure方法返回其自己的IServiceProvider实现)。

标签帮助器,控制器和视图组件在这方面有所不同,因为它们具有自己的激活器(默认的一个使用激活实用程序,在某些时候,它会使用服务提供者)。因此,AddControllersAsServices存在,因为它用ServiceBasedActivator(使用IServiceProvider,请参见ServiceBasedControllerActivator)替换了DefaultControllerActivator(其使用ActivationUtilities,请参见DefaultControllerActivator.cs)。

另请参阅此相关答案,以获取有关如何通过DI解析控制器,标记助手和查看组件的详细信息。

1
2
3
4
5
var builder = services
    .AddMvc()
    .AddControllersAsServices() // this one for your case
    .AddViewComponentsAsServices()
    .AddTagHelpersAsServices();


我本人只是遇到了这个问题,所以我想分享给以后参考,因为我有一个案例想解决一个委托,但包括一个额外的库似乎有点过头了。

给出以下定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
public interface ISomething { /*...*/ };
public interface ISomeService { /*...*/ }

public class SomeService : ISomeService { /*...*/ }

public class Something
{
    public Something(ISomeService service, string key) { /*...*/ }
}

// I prefer using a delegate for readability but you
// don't have to use one
public delegate ISomething CreateSomething(string key);

代表可以这样注册:

1
2
3
var builder = services
    .AddSingleton<ISomeService, SomeService>()
    .AddTrasient<CreateSomething>(provider => key => new Something(provider.GetRequiredService<ISomeService>(), key));