【问题标题】:Dependency error while resolving controller with autofac使用 autofac 解析控制器时出现依赖错误
【发布时间】:2015-10-20 14:24:03
【问题描述】:

我正在开发一个 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>();

但是在页面我得到错误:

发生错误。 尝试创建类型控制器时出错 '工资中心报告控制器'。确保控制器具有 无参数的公共构造函数。 System.InvalidOperationException 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor 控制器描述符,类型 控制器类型)在 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(类型类型) System.Web.Http.Internal.TypeActivator.Create[TBase](类型 实例类型)在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage 请求,类型控制器类型,Func`1& 激活器)在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor 控制器描述符,类型 控制器类型)

解决它的唯一方法是显式使用带有控制器的程序集:

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) 的情况下解决它?

【问题讨论】:

    标签: c# asp.net autofac


    【解决方案1】:

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

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

    可能需要多个程序集:

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

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


    顺便说一句,我建议使用IModule,而不是您的自定义IAutofacIntitializer 界面。更多信息请见documentation

    【讨论】:

      【解决方案2】:

      我在将 OData 导入 MVC5 项目的过程中遇到了类似的错误。以下步骤帮助我启动并运行它:

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

      2. 使用using Autofac.Integration.WebApi;在 Global.asax.cs(或您正在启动 Autofac 的任何地方)中添加对 WebApi2 扩展的引用

      3. MVC 和 WebApi 使用单独的 DI 框架。对于 MVC,请使用 builder.RegisterControllers 注册您的控制器。对于 WebApi2 (OData),请使用 builder.RegisterApiControllers

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-07
        • 1970-01-01
        • 2018-08-17
        • 1970-01-01
        • 1970-01-01
        • 2021-03-02
        • 2010-09-10
        • 1970-01-01
        相关资源
        最近更新 更多