2017-02-06 29 views
0

我想讓Umbraco和Autofac一起玩,這樣我的API控制器就可以通過容器來解析,並且我可以添加構造函數的依賴關係。Umbraco API控制器 - 從DI容器解析

每當我試着在此刻訪問的API控制器,我得到一個錯誤,從默認的控制器激活:

試圖創建 型「MigrateUsersController」的控制器時發生錯誤。確保控制器有一個 無參數公共構造函數。

但我不想使用默認激活器 - 我想從Autofac解析控制器。這是我有atm:

public static void Configure(IAppBuilder app) 
{ 
    var builder = new ContainerBuilder(); 

    //register all controllers found in this assembly 
    builder.RegisterControllers(typeof(IocConfig).Assembly); 
    builder.RegisterApiControllers(typeof(IocConfig).Assembly); 

    builder.RegisterControllers(typeof(Umbraco.Web.UmbracoApplication).Assembly); 
    builder.RegisterApiControllers(typeof(Umbraco.Web.UmbracoApplication).Assembly); 

    builder.RegisterModule(new ServiceRegistrar()); 

    container = builder.Build(); 
    app.UseAutofacMiddleware(container); 

    DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
    GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); 
} 

任何人都知道我在這裏失蹤?

回答

0

我在這裏找到了答案: http://24days.in/umbraco-cms/2015/integrating-an-application-into-umbraco-(using-ninject)/

我錯過了這一點:

GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new UmbracoWebApiHttpControllerActivator(kernel)); 

下面是我的實現自定義的活化劑:

public class UmbracoWebApiControllerActivator : IHttpControllerActivator 
{ 
    private readonly DefaultHttpControllerActivator _defaultHttpControllerActivator; 
    private readonly IContainer _container; 

    public UmbracoWebApiControllerActivator(IContainer container) 
    { 
     this._defaultHttpControllerActivator = new DefaultHttpControllerActivator(); 
     this._container = container; 
    } 

    public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 
    { 
     object instance = null; 
     if (_container.TryResolve(controllerType, out instance)) 
     { 
      if (instance is IHttpController) 
       return (IHttpController)instance; 
     } 

     IHttpController controller = 
      this.IsUmbracoController(controllerType) 
       ? Activator.CreateInstance(controllerType) as IHttpController 
       : this._defaultHttpControllerActivator.Create(request, controllerDescriptor, controllerType); 

     return controller; 
    } 

    private bool IsUmbracoController(Type controllerType) 
    { 
     return controllerType.Namespace != null 
      && controllerType.Namespace.StartsWith("umbraco", StringComparison.InvariantCultureIgnoreCase); 
    } 
}