使用autoface解析控制器时出现依赖错误

本文关键字:依赖 错误 控制器 autoface 使用 | 更新日期: 2023-09-27 18:18:35

我正在开发一个ASP。MVC应用程序。我使用autoface进行DI。我的控制器PayrollCenterReportsController放置在assembly 'LK.Reports.Services.WebApi。

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>>();
            ...
        }
    }

和全局。当我使用我的初始化式时:

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

但是在page i get error:

出现错误。尝试创建类型为的控制器时发生错误"PayrollCenterReportsController"。确保控制器有无参数公共构造函数。系统。InvalidOperationException在System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (HttpRequestMessageHttpControllerDescriptor, TypecontrollerType)System.Web.Http.Controllers.HttpControllerDescriptor.CreateController (HttpRequestMessage请求)System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext ()错误有发生。类型"LK.Reports.Services.WebApi.Module.Controllers.PayrollCenterReportsController"没有默认构造函数系统。ArgumentException在System.Linq.Expressions.Expression。新(类型类型)在System.Web.Http.Internal.TypeActivator.Create [TBase](类型instanceType)System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator (HttpRequestMessage请求,类型controllerType, Func ' 1&激活)System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (HttpRequestMessageHttpControllerDescriptor, TypecontrollerType)

解决这个问题的唯一方法是显式地使用assembly和controller:

var a = typeof (PayrollCenterReportsController)

使用这段代码Autofac解决依赖关系和一切都很好。

加载装置

assembly = Assembly.Load("LK.Reports.Services.WebApi.Module, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");

没有帮助

是否有任何方法来解决它没有显式使用typeof(PayrollCenterReportsController)在Global.asax?

使用autoface解析控制器时出现依赖错误

如果你想避免显式注册所有控制器,你可以使用RegisterControllers方法

builder.RegisterControllers(typeof(MvcApplication).Assembly);

可以接受多个程序集:

builder.RegisterControllers(AppDomain.CurrentDomain.GetAssemblies());

您可以在文档中找到更多信息:


顺便说一下,我建议使用IModule代替您的自定义IAutofacIntitializer接口。更多信息请参见文档

我刚刚遇到了一个类似的错误在我的方式得到OData进入MVC5项目。以下步骤帮助我启动并运行它:

  1. 使用Autofac。WebApi2的nuget包,而不是Autofac。WebApi包。(并卸载Autofac。在添加WebApi2之前添加WebApi2,这将节省您手动添加WebApi2到引用)

  2. using Autofac.Integration.WebApi;

  3. 在您的Global.asax.cs(或任何您正在旋转Autofac的地方)中添加对WebApi2扩展的引用
  4. MVC和WebApi使用独立的DI框架。对于MVC,用builder.RegisterControllers注册你的控制器。对于WebApi2 (OData)使用builder.RegisterApiControllers .

  5. 最后,设置你的DI解析器,一个用于MVC,一个用于WebApi2:

    DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); // MVC

    GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); // WebApi2