これは可能ではないと思いますが、質問する価値はあると思います。
インターフェイスを共有する次の型があります (これは以前に尋ねた質問とは異なります)。
public interface ICustomer;
public class CustomerBO : ICustomer
public class CustomerSO : ICustomer // SO is Service Object in this case.
次に、次のマッピングがあります。
Mapper.Map<ICustomer, ICustomer>();
さて、ここが興味深い/混乱するところです。
これは機能します:
Mapper.Map<ICustomer, ICustomer>(customerSO, new CustomerBO);
これは機能しません:
Mapper.Map(customerSO, new CustomerBO());
通常、2 つのインターフェイス タイプが定義された最初の Map ステートメントを入力するだけでは問題はありませんが、Customer オブジェクトがどこかに埋もれている場合に問題が発生します。
public class CustomerOrderDTO
{
ICustomer customer;
}
public class CustomerOrderSO
{
CustomerSO customer;
}
Mapper.Map<CustomerOrderDTO, CustomerOrderSO>();
ICustomer から CustomerSO へのマッピングがないため、これは機能しません。構成アサーションは失敗します。
現在、私はこれを行うことで問題を回避しています:
Mapper.CreateMap<CustomerOrderDTO, CustomerOrderSO>()
.ForMember(desc => dest.customer
, exp => exp.MapFrom(src => Mapper.Map<ICustomer, ICustomer>(src.customer
, new CustomerSO));
ただし、私たちが持っているすべての DTO タイプのオブジェクトに対してこれを行う必要があり、その後、カスケード効果が生じる可能性が非常に高くなります。
技術的には、問題を解決するために次のことを実行できることを理解しています。
Mapper.Map<CustomerBO, CustomerSO>();
ただし、CustomerBO には、インターフェイスではなく、ビジネス ロジックで使用される他の多くのプロパティがあります。同様に、インターフェイスではなく CustomerSO にも多くのプロパティがあります。上記のルートを使用すると、大量の Ignore() 呼び出しが発生し、CustomerBO を CustomerSO にマップし、CustomerSO を CustomerBO にマップする必要があり、それぞれに固有の Ignore 呼び出しのリストが含まれます。インターフェイスを使用すると、Ignore 呼び出しの必要がなくなります。一方から他方に表示したいデータはインターフェイスで定義されているためです。
要するに、私の質問は次のとおりです。実装クラスの 1 つに遭遇したときに、AutoMapper にインターフェイス マップを使用するように指示する方法はありますか? それに失敗した場合、必要に応じてインターフェイス間マッピングを強制するために、MapFrom デリゲートで Map を呼び出す以外の (より良い) 方法はありますか?