使用autofac

时间:2015-10-20 14:24:04

标签: c# asp.net autofac

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

2 个答案:

答案 0 :(得分:1)

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

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

可能需要多个程序集:

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

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

顺便说一下,我推荐使用IAutofacIntitializer而不是您的自定义IModule界面。有关详细信息,请参阅documentation

答案 1 :(得分:0)

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

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

  2. 使用using Autofac.Integration.WebApi;

  3. 在Global.asax.cs中添加对WebApi2扩展程序的引用(或者在您旋转Autofac的任何地方)
  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