繁体   English   中英

无法使用 ASP.NET Core DI 注入委托

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

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

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 提供基础,并为集成 3rd 方 IoC 容器(具有自动发现、装饰器等高级功能)提供简单的方法(基本上他们所需要的只是处理IServiceCollection中的信息并从Configure方法返回他们自己的IServiceProvider实现)。

标签助手、控制器和视图组件在这方面有所不同,因为它们有自己的激活器(默认使用激活实用程序,在管道下游的某个点使用服务提供程序)。 出于这个原因, AddControllersAsServices存在,因为它将DefaultControllerActivator (使用 ActivationUtilities,请参阅DefaultControllerActivator.cs )替换为ServiceBasedActivator (使用IServiceProvider ,请参阅ServiceBasedControllerActivator )。

另请参阅此相关答案,了解有关如何通过 DI 解析控制器、标记助手和视图组件的详细信息。

var builder = services
    .AddMvc()
    .AddControllersAsServices() // this one for your case
    .AddViewComponentsAsServices()
    .AddTagHelpersAsServices();

我自己刚刚遇到了这个问题,所以我想我会分享以供将来参考,因为我有一个案例,我想解决一个委托,但包括一个额外的库似乎有点过头了。

鉴于以下定义:

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);

委托可以像这样注册:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM