我刚刚将一个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
我需要以某种方式解决这个问题。
答案 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
}
}