说我有一个像这样的MVC核心控制器:
public class SomeController
{
public SomeController(IConfiguration appConfig, Func<string> someDelegate)
{
}
}
另外,我正在使用AutoFac解析注入。对象注入正在完美地工作,而添加委托注入产生一个ASP.NET核心异常,它告诉Func<string>
无法注入,因为没有组件可以注入这种类型。
当我尝试使用AutoFac手动解析SomeController
时,我得到了所需的行为。
有没有办法在不使用AutoFac解析控制器的情况下支持这种情况?
答案 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));