-1

オートマッパーを使用して、WS からのオブジェクトを平坦化しています。単純化されたモデルは次のようになります。

public abstract class AOrder {
    public Product Product {get;set;}
    public decimal Amount {get;set;}
    //number of other properties
}

public abstract class Product {
    //product properties
}
public class RatedProduct : Product {
   public int Rate { get;set;}
}

public class MarketOrder : AOrder {
    //some specific market order properties
}

オートマッパーを使用して、これを次のように平坦化しようとしています:

public class OrderEntity {
   public decimal Amount {get;set;}
   public int ProductRate {get;set;}
}

次のマッピングで:

CreateMap<RatedProduct, OrderEntity>();
CreateMap<MarketOrder, OrderEntity>();

上記のマッピングは ProductRate をマッピングしません。 Atm AfterMap を使用しました:

CreateMap<MarketOrder, OrderEntity>()
    .AfterMap((s,d) => {
         var prod = s.Product as RatedProduct;
         if (prod != null) 
         {
             //map fields
         }
     });

これはかなりうまく機能しますが、オートマッパーの平坦化の可能性 (名前によるマッチング) を再利用できれば、多くの場所でアフター マップを適用する必要はないと考えました。

注: WS を変更することはできません。これは、オブジェクト階層のほんの一部です。

アドバイスをいただければ幸いです。

4

1 に答える 1

1

RateからProductRateへのマッピングは、「ForMember」を使用するとかなり簡単です。

特定のタイプにキャストしてそのタイプであるかどうかを確認する必要があるものは少しトリッキーですが、あなたが取ったのと同じアプローチがあなたがしなければならないことだと思いますが、私はあなたがする必要はないと思います」アフターマップ」。すべての宛先マッピングを見つける必要があるか、マッピングの無視としてマークする必要があると思いました。

他にできることは、 OrderEntity.ProductRate を OrderEntity.Rate に変更することです。次に、Product にはレートがない (RatedProducts にはある) ため、非表示になっている場所を除いて、それを見つけてマップします。

public class OrderEntity {
   public decimal Amount {get;set;}
   public int Rate {get;set;}  //changed name from ProductRate to just Rate.
}

 Mapper.CreateMap<Product, OrderEntity>()
    .Include<RatedProduct, OrderEntry>();

 Mapper.CreateMap<RatedProduct, OrderEntry>();

参照:コレクション内のポリモーフィックな要素の型

于 2013-05-08T12:06:49.150 に答える