Autofac - Mvc 5 beta - DependencyResolver无法获取类型

时间:2013-07-14 16:25:37

标签: asp.net asp.net-web-api autofac asp.net-mvc-5

我刚刚将一个MVC 4项目转换为MVC 5 beta(以及一个Web Api项目转换为Web Api 2),我遇到了DependencyResolver无法解决我需要的类的问题。

以下是我要解决的课程:

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

以下是我如何在Bootstrapper.cs中使用Autofac注册它(我在两个项目中都这样做):

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

我还在两个项目中注册了DependencyResolver:

在Mvc项目中:

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

在Web Api项目中:

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

然后在第三个项目中,我调用以下内容来解析引用:

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

但这给了我一个空handler

我需要以某种方式解决这个问题。

1 个答案:

答案 0 :(得分:0)

好吧我想出了如何替换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
    }
}