2015-10-20 30 views
0

我正在開發一個ASP.MVC應用程序。我使用Autofac進行DI。我的控制器以組裝 'LK.Reports.Services.WebApi.Module' PayrollCenterReportsController的地方,需要在構造一些serivce:用autofac解析控制器時的依賴性錯誤

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

      ... 
     } 
    } 

,並在全球註冊serivce。 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>(); 

但在頁我得到錯誤:

An error has occurred. An error occurred when trying to create a controller of type 'PayrollCenterReportsController'. Make sure that the controller has a parameterless public constructor. System.InvalidOperationException at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request) at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext() An error has occurred. Type 'LK.Reports.Services.WebApi.Module.Controllers.PayrollCenterReportsController' does not have a default constructor System.ArgumentException at System.Linq.Expressions.Expression.New(Type type) at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator) at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, 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中explitly使用typeof(PayrollCenterReportsController)?

回答

0

如果你想避免明確註冊你的控制器,你可以使用RegisterControllers方法

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

這可能需要一個以上的組件:

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

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


順便說一句,而不是你自定義的IAutofacIntitializer接口,我推薦使用IModule。請參閱documentation以獲取更多信息

0

我剛剛在將OData轉換爲MVC5項目的過程中遇到了類似的錯誤。下面的步驟幫助我得到它運行起來:

  1. 使用Autofac.WebApi2 NuGet包,而不是Autofac.WebApi包。 (並且在添加WebApi2之前卸載Autofac.WebApi,這將使您無需手動將WebApi2添加到引用中。)

  2. 在Global.asax.cs中添加對WebApi2擴展的引用(或無論您在哪裏旋轉Autofac)與using Autofac.Integration.WebApi;

  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

相關問題