2011-01-05 126 views
1

我想將我的ViewModel類映射到Web服務DTO對象。該的ViewModels使用以下約定:基於AutoMapper Convention的系統

CustomerViewModel 
OrderStatusViewModel 

的WCF類DTO有如下約定:

Customer 
OrderStatus 

另外,如果在WCF類DTO有如下約定:

CustomerDTO 
OrderStatusDTO 

問題是如何使用AutoMapper在ViewModel和WCF類之間進行映射?我想以某種方式映射所有未來的ViewModels和WCF類由於上述配置而自動映射。

+0

也許這只是我,但我實在不明白一個問題在這裏。我看到你對你的命名約定作了一些陳述,但是它是什麼問題呢? – spinon 2011-01-05 20:50:03

+0

查看更新的問題! – johndoe 2011-01-05 20:51:33

回答

3

我後來寫了關於這個。檢查「,如果你想呃了:http://www.weirdlover.com/2010/07/01/the-big-boy-mvc-series-part-22-whoop/

增加提及Automapper

創建基礎視圖模型類:

public abstract class MappedTo<T> 
{ 
    public MappedTo() 
    { 
     Mapper.CreateMap(GetType(), typeof(T)); 
    } 

    public T Convert() 
    { 
     return (T)Mapper.Map(this, this.GetType(), typeof(T)); 
    } 
} 

創建ViewModel類,從繼承上述基地。指定您希望您的視圖模型映射到DTO:

class AddressViewModel : MappedTo<Address> 
{ 
    public string Line1 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
} 

AutoMapper應該處理其餘部分:

static void Main(string[] args) 
{ 
    AddressViewModel addressVm = new AddressViewModel 
    { 
     Line1 = "555 Honolulu Street", 
     City = "Honolulu", 
     State = "HI" 
    }; 

    Address address = addressVm.Convert(); 

    Console.WriteLine(address.Line1); 
    Console.WriteLine(address.City); 
    Console.WriteLine(address.State); 
    Console.ReadLine(); 
} 

如果你想獲得幻想,您可以創建另一個視圖模型的基礎CALSS,可以讓你在自己的的TypeConverter經過:

public abstract class MappedTo<T, TConverter> 
{ 
    public MappedTo() 
    { 
     Mapper.CreateMap(GetType(), typeof(T)).ConvertUsing(typeof(TConverter)); 
    } 

    public T Convert() 
    { 
     return (T)Mapper.Map(this, this.GetType(), typeof(T)); 
    } 
} 

然後,您可以從您的視圖模型轉換成你的DTO但是您認爲合適的:

public class AddressConverter : TypeConverter<AddressViewModel, Address> 
{ 
    protected override Address ConvertCore(AddressViewModel source) 
    { 
     return new Address 
     { 
      Line1 = source.Line1 + " foo", 
      City = source.City + " foo", 
      State = source.State + " foo" 
     }; 
    } 
} 
+0

這真棒!但是,我可以告訴AutoMapper,我的約定是,視圖模型將具有相同的確切名稱,但最後使用「ViewModel」這個詞。如CustomerViewModel(viewmodel)和Customer(類)。所以,Automapper可以自動解析所有的映射。 – azamsharp 2011-01-06 00:49:14

+0

@azamsharp - 我不這麼認爲。我可能是錯的,但你必須告訴AutoMapper你想映射哪兩個類。您可以使用T4模板自動生成基於約定的映射,但似乎沒有必要。爲什麼不像上面所做的那樣做「CustomerViewModel:MappedTo 」?這太痛苦了嗎?乾杯,E – 2011-01-06 01:16:33

+0

謝謝ewwwyn!我會用你的方法! – azamsharp 2011-01-06 03:07:42

0

你可以看看這個:mvmmapper.codeplex.com 我爲Visual Studio寫了一個工具,爲你生成映射。

閱讀例子來得到一個什麼樣的工具,並再決定編寫自己的工具或使用現有的想法...

編輯:有一個look at this code是從MVMMapper和正在生成。它可能會給你一個想法。

+0

上面提到了這個問題!如何在ViewModel和WCF類之間進行映射? – johndoe 2011-01-05 20:54:22

+0

謝謝,但我必須使用AutoMapper! – johndoe 2011-01-05 20:57:29

+0

啊,是的,我注意到,你添加你的問題後。 – 2011-01-05 21:00:56