2017-02-06 20 views
0

Я пытаюсь заставить Umbraco хорошо играть с Autofac, чтобы мои контроллеры API разрешались через контейнер, и я могу добавлять зависимости конструктора.Umbraco API Controllers - Resolve From DI Container

Всякий раз, когда я пытаюсь получить доступ к контроллеру 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); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^