Autofac无法解析模型绑定器依赖关系

时间:2014-01-18 07:52:47

标签: dependency-injection asp.net-web-api inversion-of-control autofac

在我的容器中,我已经注册了我的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));

1 个答案:

答案 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