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