我正在开发一个ASP.MVC应用程序。我使用Autofac进行DI。我的控制器PayrollCenterReportsController放置在程序集'LK.Reports.Services.WebApi.Module'并且在构造函数中需要一些服务:
public class PayrollCenterReportsController : ODataControllerBase<PayrollCenterReports>
{
public PayrollCenterReportsController(IDataService<PayrollCenterReports> service)
: base(service)
{
}
}
我在其他集会上注册服务
public class MenaAutofacInitializer : IAutofacIntitializer
{
public void Initialize(ContainerBuilder builder)
{
...
builder.RegisterType<PayrollCenterReportsClientService>().As<IDataService<PayrollCenterReports>>();
...
}
}
在Global.asax我使用我的初始化器:
var builder = new ContainerBuilder();
new MenaAutofacInitializer().Initialize(builder);
var container = builder.Build();
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
SiteMaps.Loader = container.Resolve<ISiteMapLoader>();
但在页面上我收到错误:
发生了错误。 尝试创建类型的控制器时发生错误 'PayrollCenterReportsController'。确保控制器有一个 无参数公共构造函数。 System.InvalidOperationException 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor controllerDescriptor,Type controllerType)at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage 请求) System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext() 错误有 发生了。类型 'LK.Reports.Services.WebApi.Module.Controllers.PayrollCenterReportsController' 没有默认构造函数 System.ArgumentException 在System.Linq.Expressions.Expression.New(Type type)at System.Web.Http.Internal.TypeActivator.Create [TBASE](类型 instanceType)at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage 请求,输入controllerType,Func`1&amp;激活者) System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor controllerDescriptor,Type controllerType)
解决它的唯一方法是明确使用带控制器的程序集:
var a = typeof (PayrollCenterReportsController)
使用此代码Autofac解决依赖关系并且一切正常。
加载程序集
assembly = Assembly.Load("LK.Reports.Services.WebApi.Module, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
没有帮助
有没有办法解决它而没有在Global.asax中使用typeof(PayrollCenterReportsController)?
答案 0 :(得分:1)
如果您想避免显式注册所有控制器,可以使用RegisterControllers
方法
builder.RegisterControllers(typeof(MvcApplication).Assembly);
可能需要多个程序集:
builder.RegisterControllers(AppDomain.CurrentDomain.GetAssemblies());
您可以在文档中找到更多信息:Register Controllers
顺便说一下,我推荐使用IAutofacIntitializer
而不是您的自定义IModule
界面。有关详细信息,请参阅documentation
答案 1 :(得分:0)
我在将OData纳入MVC5项目的过程中遇到了类似的错误。以下步骤帮助我启动并运行:
使用Autofac.WebApi2 nuget包,而不是Autofac.WebApi包。 (并在添加WebApi2之前卸载Autofac.WebApi,这样可以避免手动将WebApi2添加到引用中。)
使用using Autofac.Integration.WebApi;
MVC和WebApi使用单独的DI框架。对于MVC,请使用builder.RegisterControllers
注册控制器。对于WebApi2(OData),请使用builder.RegisterApiControllers
。
最后,设置你的DI解析器,一个用于MVC,一个用于WebApi2:
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); // MVC
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); // WebApi2