2016-08-11 39 views
2

我用AutoMapper將class Foo映射到class Bar。 Bar是Foo的ViewModel。 Bar具有更少的屬性,但它具有的所有屬性都與相應的Foo屬性完全匹配,除了Bar在Foo中不存在的其中一個屬性上具有自定義驗證屬性。如何在使用AutoMapper時跳過自定義驗證屬性?

public class Foo 
{ 
    string Prop1 { get; set; } 
    string Prop2 { get; set; } 
    string Prop3 { get; set; } 
    string Prop4 { get; set; } 
    string Prop5 { get; set; } 
} 

public class Bar 
{ 
    string Prop1 { get; set; } 
    string Prop2 { get; set; } 

    [CustomValidation]  
    string Prop3 { get; set; } 
} 

我想使用AutoMapper映射一個富到酒吧,但我不希望當映射恰好是運行「CustomValidation」屬性。

這是我的映射代碼看起來像......

  Mapper.Initialize(cfg => cfg.CreateMap<Foo, Bar>(MemberList.None) 
      .ForMember("Prop3", m => m.Ignore())); 

即使在MemberList.None在的Prop3被明確忽略傳遞...它仍是起火的CustomValidation屬性。

我該如何阻止它這樣做?

或可替代...

我能火與非默認構造函數的CustomValidation屬性?

把這個相當奇怪的問題放在上下文中。我試圖單元測試一個執行這個映射的Controller方法。 CustomValidation屬性命中數據庫,我想避免這種情況來加速單元測試。我確實已將CustomValidation屬性設置爲在構造函數中接受IoC容器,這將允許我傳入模型並避開數據庫,這將是完全避免驗證的完美替代解決方案。

回答

0

自動映射器不關心驗證屬性。

如果您不希望在您的測試中執行真正的驗證,我認爲將數據庫抽取到服務或存儲庫以便您可以將其模擬或存入測試中是一種有效的方法。

我真的認爲Auto Mapper不是你的問題。

+0

自定義驗證屬性已經接受IoC容器作爲構造參數,以便我可以用模擬庫進行單元測試。當我單獨測試自定義驗證屬性時,這很好。 問題是,我試圖單元測試一個控制器方法,它自己正在執行從模型到ViewModel的AutoMapper映射,並且ViewModel包含自定義驗證屬性。 我可以將IoC容器傳入控制器,並分別傳遞到自定義屬性中,但看起來並不是通過AutoMapper從控制器傳遞給屬性。 – spoonraker

+1

好吧我現在明白了。但是,我們清楚地知道,你正在談論設定模型tate的價值的驗證。有效,對嗎?如果是的話,你怎麼扼殺它?粘貼該代碼將幫助我幫助你。 –

+0

* ModelState.IsValid –

相關問題