2014-03-04 62 views
1

這是我Bootstrap在Global.asax中Autofac MVC5和WebAPI2.1不工作

public class Global : HttpApplication { 
     void Application_Start(object sender, EventArgs e) { 
      AreaRegistration.RegisterAllAreas(); 
      GlobalConfiguration.Configure(WebApiConfig.Register); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 

      // initiate dependency injection resolver 
      DependencyInjectionResolver.RegisterDependencies(typeof(Global).Assembly); 
     } 
    } 

這裏是實現

public class DependencyInjectionResolver { 
    private static IContainer _container; 

    public static TService Resolve<TService>() { 
     return DependencyResolver.Current.GetService<TService>(); 
    } 

    public static void RegisterDependencies(Assembly assembly) { 
     var builder = new ContainerBuilder(); 
     builder.RegisterFilterProvider(); 
     builder.RegisterControllers(Assembly.GetExecutingAssembly()); 
     builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

     builder.RegisterGeneric(typeof (Repository<>)) 
      .As(typeof (IRepository<>)) 
      .InstancePerHttpRequest() 
      .InstancePerLifetimeScope(); 

     builder.RegisterType<LoggerService>() 
      .As<ILoggerService>() 
      .InstancePerApiRequest() 
      .InstancePerHttpRequest(); 

     builder.Register(x => 
      new MessageDataService(Resolve<ILoggerService>(), Resolve<IRepository<ApiRequestHistory>>())) 
      .As<IMessagesDataService>() 
      .InstancePerHttpRequest() 
      .InstancePerApiRequest(); 

     #region setup 

     _container = builder.Build(); 
     DependencyResolver.SetResolver(new AutofacDependencyResolver(_container)); 
     GlobalConfiguration.Configuration.DependencyResolver 
      = new AutofacWebApiDependencyResolver(_container); 
     #endregion 
    } 
} 

這裏是我的例外:

An error has occurred.An error occurred when trying to create a controller of type 'MessageReportController'. 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.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken) 
    at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()An error has occurred.Type 'WayToLead.Web.UI.api.MessageReportController' does not have a default constructorSystem.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) 

如何解決它與WebApi和Mvc控制器一起工作?

+0

我得到了與ApiControllers相同的問題,但是,但MVC控制器正在解決和構建得很好。您是否也只在WebApi2控制器出現問題? – enriquein

+0

我也是。我沒有解決這個問題。 – IamStalker

+0

我設法解決了這個問題。深入內部的一個或兩個異常我注意到,真正發生的事情是我有一個未註冊的依賴,這是依賴於api控制器所需的。在我註冊後,它開始工作了。 – enriquein

回答

0

檢查您是否註冊了所有的ApiControllers的依賴項和子依賴項。在堆棧跟蹤深處的某處,您可能會發現AutoFac依賴AutoFac無法解析。

我猜測由於AutoFac無法滿足所有的依賴關係,所以默認的依賴關係解析器接管了。

+0

我會檢查出來,然後回到雅。謝謝。 – IamStalker

相關問題