4

在我的容器,我注册我的IModelBinder的和Autofac模型绑定提供商:Autofac不解析模型绑定依赖

​​

我使用的是类本身的属性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,事实证明,它最有可能没有任何意义调用RegisterWebApiModelBinders中的Web API 2.本期已reported到Autofac。

要注册模型粘合剂,一个需要调用:

builder.RegisterType<RequestContextModelBinder>().AsModelBinderForTypes(typeof(RequestContext)); 

回答

4

如果明确指定ModelBinderAttribute一个Type然后Wep.Api尝试获取给定类型的实例形成DependencyResolver

时Wep.Api试图与它的具体类型解析失败和Wep.Api将回退到Activator.CreateInctance创建其未能在您的自定义模型绑定实例来解决您的粘结剂然而Autofac注册模型绑定类型的IModelBinder接口等等构造函数。如果没有在ModelBinderAttribute然后给定类型

[ModelBinder] 
public class RequestContext 
{ 
    // ... properties etc. 
} 

builder.RegisterType<RequestContextModelBinder>().AsSelf(); 

或者,你可以删除从ModelBinderAttribute类型:

您可以注册您RequestContextModelBinder自我修复此Wep.API询问当前ModelBinderProvider是否有适用于您的模型类型的活页夹,在这种情况下,AutofacWebApiModelBinderProvider将正确解析您的RequestContextModelBinder

不过,如果你已经正确地

builder.RegisterType<RequestContextModelBinder>() 
     .AsModelBinderForTypes(typeof (RequestContext)); 

注册时仅AutofacWebApiModelBinderProvider您解析粘结剂所以写RegisterWebApiModelBinders不够你需要注册您的粘合剂时使用的AsModelBinderForTypes

+0

这很有道理。但是我仍然无法使它工作。通过将ModelBinderAttribute更改为不包含特定类型,似乎Autofac会选择正确的模型绑定器,但它仍不能解决模型绑定器中的依赖关系。我得到了“没有为这个对象定义的无参数构造函数” - 错误。 –

+0

如果仍然得到“为该对象定义的无参数构造函数”。那么Autofac绝对不会拿起你的模型绑定器,否则你会得到一个不同的错误... – nemesv

+0

似乎'RegisterWebApiModelBinders'方法不起作用。即使您没有在属性中指定类型,您也需要显式注册您的模型绑定器。但在这种情况下,您需要编写:'builder.RegisterType ()。AsModelBinderForTypes(typeof(RequestContext));'。请试试看,如果它正在工作,那么我会用这个信息更新我的答案。 – nemesv