在我的容器中,我注册了 IModelBinder 和 Autofac 模型绑定(bind)器提供程序:
builder.RegisterWebApiModelBinders(Assembly.GetExecutingAssembly());
builder.RegisterWebApiModelBinderProvider();
我正在使用类本身的 ModelBinder 属性将我的模型绑定(bind)器绑定(bind)到一个类:
[ModelBinder(typeof(RequestContextModelBinder))]
public class RequestContext
{
// ... properties etc.
}
以及模型绑定(bind)器本身,具有依赖关系:
public class RequestContextModelBinder : IModelBinder
{
private readonly ISomeDependency _someDependency;
public RequestContextModelBinder(IAccountsRepository someDependency)
{
_someDependency = someDependency;
}
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
// ... _someDependency is null
}
}
从 Controller 中,我可以验证 Autofac 是否正确注入(inject)了 ISomeDependency 和模型绑定(bind)器。但是,没有注入(inject)对模型绑定(bind)器的依赖。
当访问以 RequestContext 类作为参数的端点时,我得到了与模型绑定(bind)器相关的“无参数构造函数”异常。
有任何想法吗?
更新:
感谢 nemesv,事实证明调用
RegisterWebApiModelBinders
很可能没有任何意义。在 Web API 2 中。一个问题是 reported到 Autofac。要注册模型绑定(bind)器,需要调用:
builder.RegisterType<RequestContextModelBinder>().AsModelBinderForTypes(typeof(RequestContext));
最佳答案
如果您明确指定 Type
在 ModelBinderAttribute
然后 Wep.Api 尝试从 DependencyResolver
中获取具有给定类型的实例.
但是 Autofac 使用 IModelBinder
注册模型绑定(bind)器类型。接口(interface),因此当 Wep.Api 尝试使用其具体类型解析您的活页夹时,解析失败并且 Wep.Api 将回退到 Activator.CreateInctance
创建在您的自定义构造函数上失败的模型绑定(bind)器实例。
您可以通过注册 RequestContextModelBinder
来解决此问题。作为自己:
builder.RegisterType<RequestContextModelBinder>().AsSelf();
或者您可以从
ModelBinderAttribute
中删除类型:[ModelBinder]
public class RequestContext
{
// ... properties etc.
}
如果
ModelBinderAttribute
中没有给出类型然后 Wep.API 询问当前 ModelBinderProvider
用于您的模型类型的活页夹,在本例中为 AutofacWebApiModelBinderProvider
这将解决您的RequestContextModelBinder
正确。然而
AutofacWebApiModelBinderProvider
如果您已正确注册它,则仅解决您的活页夹builder.RegisterType<RequestContextModelBinder>()
.AsModelBinderForTypes(typeof (RequestContext));
所以写
RegisterWebApiModelBinders
还不够你需要使用AsModelBinderForTypes
注册活页夹时。
关于dependency-injection - Autofac 未解决模型绑定(bind)器依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21201555/