Autofac – 确保控制器具有无参数的公共构造函数
我知道之前已经被问过并回答了 – 我问的原因是因为(我认为)我尝试了所有建议的解决方案来解决这个问题,但仍无法解决问题。
我有一个ASP.NET Web API 2.0项目。 我安装了Autofac,Autofac.Mvc5和Autofac.WebApi2依赖项。 当我尝试调用API控制器时,我收到以下错误:
尝试创建“MyController”类型的控制器时发生错误。 确保控制器具有无参数的公共构造函数。
在我的Global.asax
我调用了IocConfig.Config()
,它放在App_Start
:
public static class IocConfig { public static void Config() { var builder = new ContainerBuilder(); builder.RegisterType().As(); builder.RegisterApiControllers(Assembly.GetCallingAssembly()); builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration); WebApiApplication.Container = builder.Build(); DependencyResolver.SetResolver( new AutofacDependencyResolver(WebApiApplication.Container)); GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(WebApiApplication.Container); } }
这是MyController
的构造函数:
public MyController(IMyLogger logger)
当我尝试调用它时,我得到有关构造函数的指定错误。 我错过了什么?
我也遇到了这个错误,根本原因是在Autofac中没有正确注册Controller的一个依赖项。
InnerException有详细信息(在我的例子中是Autofac.Core.DependencyResolutionException),ExceptionMessage包含了这个依赖项的细节。 沿着:
“在激活特定注册期间发生错误…无法解析参数’XXXX’
检查这个答案 。
它帮助我为WebApi控制器配置正确的ContainerBuilder()
。
如果您在此处查找此类错误的解决方案 ,则应首先检查DependencyResolver配置。
我面临同样的问题,问题是我使用的是针对MVC控制器而不是API的ContainerBuilder()
对象的Autofac代码示例。
我的代码用于注册两种类型的控制器(MVC和Api):
var builder = new ContainerBuilder(); builder.RegisterControllers(Assembly.GetExecutingAssembly()); //Register MVC Controllers builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); //Register WebApi Controllers builder.RegisterType().As(); var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); //Set the MVC DependencyResolver GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver((IContainer)container); //Set the WebApi DependencyResolver
Assembly.GetCallingAssembly()
将返回调用程序集,而不是定义类型的程序集。
Assembly.GetCallingAssembly
方法
返回调用当前正在执行的方法的方法的程序集。
为了使其工作,你应该使用typeof(IocConfig).Assembly
或Assembly.GetExecutingAssembly
我认为您缺少在应用启动代码中注册autofac。
用这个:
protected void Application_Start() { IocConfig.Config(); AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); }
有关详细信息,请参阅此博客http://www.codeproject.com/Articles/808894/IoC-in-ASP-NET-MVC-using-Autofac
打开ServiceModule文件
注册控制器中提到的接口和服务名称。
示例如下: –
。builder.RegisterType()为();