2011-01-05 8 views
1

ViewModelクラスをWebサービスのDTOオブジェクトにマップしようとしています。 viewmodelsは、次の規則を使用しています:AutoMapper Convention Based System

CustomerViewModel 
OrderStatusViewModel 

WCFクラスはDTOは、次の規則があります。

また
Customer 
OrderStatus 

、どのような場合WCFクラスはDTOは、次の規則があります。

CustomerDTO 
OrderStatusDTO 

問題は、AutoMapperを使用してViewModelクラスとWCFクラスをどのようにマップするのですか?私は、上記の設定のために将来のすべてのViewModelクラスとWCFクラスが自動的にマッピングされるように、特定の方法でマッピングしたいと思います。

+0

たぶんそれは私ですが、ここでは本当に質問は表示されません。私はあなたの命名規則についていくつかの陳述をしていますが、それはどういう疑問がありますか? – spinon

+0

更新された質問を参照してください! – johndoe

答えて

3

これについては、いつか書きました。アウトえー、あなたがしたい場合は、[チェック:Automapper

ベースのViewModelを作成しhttp://www.weirdlover.com/2010/07/01/the-big-boy-mvc-series-part-22-whoop/

への参照を追加しクラス:

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クラスを作成します。前記ベース。 AutoMapperは残りの部分を処理する必要があり

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

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(); 
} 

あなたは空想を取得したい場合、あなたはできます別のViewModelベースcalssを作成することができますあなたがあなたのViewModelをマッピングしたいのですがどのDTO指定あなた自身のの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にあなたのViewModelから変換することができますしかし、あなたは、フィット感を参照してください。

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が同じ正確な名前を持つが、最後に "ViewModel"という単語があることを伝えることができますか? CustomerViewModel(viewmodel)およびCustomer(クラス)のようなものです。そのため、Automapperはすべてのマッピングを自動的に解決できます。 – azamsharp

+0

@azamsharp - 私はそうは思わない。私は間違っているかもしれませんが、あなたはマップする2つのクラスをAutoMapperに伝えなければなりません。あなたはT4テンプレートを使って、規則に基づいてそれらのマッピングを自動生成することができますが、それは不要です。なぜ私は上記のように "CustomerViewModel:MappedTo "をしないのですか?それはあまりにも痛みですか?乾杯、 –

+0

ありがとうewwwyn!私はあなたのアプローチを使用します! – azamsharp

0

あなたはこれを見ることができます:mvmmapper.codeplex.com 私はあなたのためのマッピングを生成するVisual Studio用のツールを書いています。

ツールが何をするかのアイデアを取得し、独自のツールを作成したり、既存の...

編集に使用するかを決定する例を読む:それはMVMMapperと生成されるからであるlook at this codeを持っています。それはあなたにアイデアを与えるかもしれません。

+0

質問は上記です! ViewModelクラスとWCFクラスをどのようにマッピングすればよいですか? – johndoe

+0

ありがとうございますが、私はAutoMapperを使用する必要があります! – johndoe

+0

ああ、はい、私はあなたの質問を追加した後に気づいた。 –

関連する問題