2

這不是一個非常簡單的問題,但希望有人遇到過這個問題。在MVC2中對Castle Windsor和Entity Framework 4.0(POCO)使用FluentValidation

我試圖讓下面的東西一起工作:

  1. MVC2
  2. FluentValidation
  3. 實體框架4.0(POCO)
  4. 溫莎城堡

我已經很很多東西都得到了工作。我已經實施了Castle Windsor,並且使用了作爲MVCContrib一部分的WindsorControllerFactory提供的控制器。我也有城堡服務FluentValidation驗證程序,如本文所述:http://www.jeremyskinner.co.uk/2010/02/22/using-fluentvalidation-with-an-ioc-container/

我試圖在視圖上使用Html.EditorForModel或EditorFor時出現問題。當我嘗試這樣做,我收到此錯誤信息:

支持服務FluentValidation.IValidator`1 [System.Data.Entity.DynamicProxies.State_71C51A42554BA6C3CF05105DA05435AD209602C217FC4C34CA52ACEA2B06B99B,EntityFrameworkDynamicProxies-BrindleyInsurance.BusinessObjects號成分,版本= 1.0.0.0 ,Culture = neutral,PublicKeyToken = null]]被發現

這是由於在Entity Framework 4.0上使用POCO代。在運行時,生成的類會被動態代理封裝,以便跟蹤和延遲加載。顯然,在使用EditorForModel或EditorFor時,它試圖要求Windsor爲動態代理類型創建驗證程序,而不是基礎實型。

有誰知道我能做些什麼來解決這個問題?

+0

有沒有什麼辦法可以檢測EF4中的代理? – 2010-05-21 01:59:35

+0

你是如何得到這個的 - 讓IValidator關閉代理類型? – 2010-05-21 06:59:47

+0

該框架對此負責。我使用了實體框架4和POCO模板。 EF在運行時用代理類型包裝真實類型,以便它可以執行Lazy Loading之類的操作。所以,如果你不知道它,你實際上使用的是代理類型。當框架調用驗證器工廠並將其傳遞給工廠時,該框架將採用該框架。當然,工廠不知道那是,所以你得到的錯誤。作爲答案建議之一,我將致力於創建一個新的驗證工廠。我會發布,如果我得到它的工作。 – 2010-05-21 14:31:27

回答

2

我建議你編寫定製的FluentValidatorFactory,它將爲類代理返回正確的驗證器類。

+0

這是正確的答案。我會給這個海報作爲答案,並會用我使用的實際代碼添加另一個答案。 – 2010-05-21 21:53:52

3

這是我的ValidatorFactory的CreateInstance方法。如果你看到更好的方法,請評論。

public override IValidator CreateInstance(Type validatorType) 
    { 
     if(validatorType.GetGenericArguments()[0].Namespace.Contains("DynamicProxies")) 
     { 
      validatorType = Type.GetType(String.Format("{0}.{1}[[{2}]], {3}", validatorType.Namespace, validatorType.Name, validatorType.GetGenericArguments()[0].BaseType.AssemblyQualifiedName, validatorType.Assembly.FullName)); 

     } 

     return ResolveType.Of(validatorType) as IValidator; 
    } 
+0

感謝您發佈最終解決方案 – JohnMetta 2010-10-20 22:32:05