2013-07-14 1 views
1

Я просто преобразовал проект MVC 4 в бета-версию MVC 5 (и проект Web Api в Web Api 2), и у меня возникли некоторые проблемы с DependencyResolver, которые не могут быть решены класс, в котором я нуждаюсь.Autofac - Mvc 5 beta - DependencyResolver не получает тип

Вот класс, я хочу, чтобы решить:

public class GetPartsQueryValidationHandler 
    : IQueryValidationHandler<GetPartsQuery, Part[]> 
{ 
    ... 
} 

Вот как я зарегистрировать его Autofac в Bootstrapper.cs (я делаю это в обоих проектах):

builder.RegisterAssemblyTypes(dataAccessAssembly) 
       .AsClosedTypesOf(typeof(IQueryValidationHandler<,>)) 
       .InstancePerHttpRequest(); //..PerApiRequest in Web Api 

Я также зарегистрировать DependencyResolver в обоих проектах:

в Mvc проекта:

DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

В Web Api Project:

GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

Тогда в третьем проекте я называю следующее разрешить ссылку:

var handlerType = typeof(IQueryValidationHandler<,>).MakeGenericType(query.GetType(), typeof(TResult)); 
dynamic handler = DependencyResolver.Current.GetService(handlerType); 

Но это дает мне нуль handler

Мне нужно разрешите этот класс.

ответ

0

OK Я понял, как заменить DependencyResolver ... это похоже на анти-шаблон, когда зависимость конструктора является опцией. Я не мог понять, как заставить его работать раньше, но я дал ему еще один шаг, и похоже, что все, что вам нужно, это параметр конструктора IComponentContext, и Autofac позаботится об этом по умолчанию:

public class DefaultQueryBus : IQueryBus 
{ 
    private readonly IComponentContext componentContext; 

    public DefaultQueryBus(IComponentContext componentContext) 
    { 
     this.componentContext = componentContext; 
    } 

    public IEnumerable<ValidationResult> Validate<TResult>(IQuery<TResult> query) 
    { 
     var handlerType = typeof(IQueryValidationHandler<,>).MakeGenericType(query.GetType(), typeof(TResult)); 
     dynamic handler = this.componentContext.Resolve(handlerType); //Good 
    } 
} 
Смежные вопросы