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

时间:2017-07-21 10:47:49

标签: c# dependency-injection asp.net-core delegates inversion-of-control

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

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

另外,我正在使用AutoFac解析注入。对象注入正在完美地工作,而添加委托注入产生一个ASP.NET核心异常,它告诉Func<string>无法注入,因为没有组件可以注入这种类型。

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

有没有办法在不使用AutoFac解析控制器的情况下支持这种情况?

2 个答案:

答案 0 :(得分:1)

默认情况下,控制器无法通过DI解析,它们是在DefaultControllerFactory左右构建的。

更新

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

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

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

有关如何通过DI解析控制器,标记帮助程序和查看组件的详细信息,另请参阅this related answer

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

答案 1 :(得分:0)

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

给出以下定义:

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