2017-02-06 31 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); 
    } 
}