在我的容器中,我已经注册了我的IModelBinder和Autofac模型绑定提供程序:
builder.RegisterWebApiModelBinders(Assembly.GetExecutingAssembly());
builder.RegisterWebApiModelBinderProvider();
我正在使用类本身的ModelBinder属性将模型绑定器绑定到类:
[ModelBinder(typeof(RequestContextModelBinder))]
public class RequestContext
{
// ... properties etc.
}
模型绑定器本身具有依赖性:
public class RequestContextModelBinder : IModelBinder
{
private readonly ISomeDependency _someDependency;
public RequestContextModelBinder(IAccountsRepository someDependency)
{
_someDependency = someDependency;
}
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
// ... _someDependency is null
}
}
从控制器,我可以验证Autofac是否正确地注入了ISomeDependency和模型绑定器。但是,不会注入对模型绑定器的依赖。
当访问具有RequestContext类作为参数的端点时,我得到了“No parameterelss constructor”-exception,它与模型绑定器有关。
有什么想法吗?
感谢nemesv,事实证明在Web API 2中调用RegisterWebApiModelBinders
很可能没有任何意义。问题一直是reported到Autofac。
要注册模型绑定器,需要调用:
builder.RegisterType<RequestContextModelBinder>().AsModelBinderForTypes(typeof(RequestContext));
答案 0 :(得分:4)
如果在Type
中明确指定ModelBinderAttribute
,那么Wep.Api会尝试从DependencyResolver
获取具有给定类型的实例。
然而,Autofac使用IModelBinder
接口注册模型绑定器类型,因此当Wep.Api尝试使用其具体类型解析绑定器时,解析失败,Wep.Api将回退到Activator.CreateInctance
以创建模型在自定义构造函数上失败的binder实例。
您可以通过将RequestContextModelBinder
注册为自己来解决此问题:
builder.RegisterType<RequestContextModelBinder>().AsSelf();
或者您可以从ModelBinderAttribute
:
[ModelBinder]
public class RequestContext
{
// ... properties etc.
}
如果ModelBinderAttribute
中没有给出任何类型,那么Wep.API会询问当前ModelBinderProvider
您的模型类型的活页夹,在这种情况下,AutofacWebApiModelBinderProvider
会解析您的{ {1}}正确。
但是RequestContextModelBinder
只有在您使用
AutofacWebApiModelBinderProvider
因此,在注册您的活页夹时,您需要使用builder.RegisterType<RequestContextModelBinder>()
.AsModelBinderForTypes(typeof (RequestContext));
来撰写RegisterWebApiModelBinders
。