6

これは可能ではないと思いますが、質問する価値はあると思います。

インターフェイスを共有する次の型があります (これは以前に尋ねた質問とは異なります)。

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 を呼び出す以外の (より良い) 方法はありますか?

4

1 に答える 1

3

一般に、インターフェイスへのマッピングを構成し、ICustomerを使用して宛先タイプをオーバーライドします.As<TDestination>()(これは、最初に質問したときからの追加かもしれません。)

これは、例のように、2 つのレイヤー間のマッピングで機能します。

Mapper.CreateMap<CustomerDTO, ICustomer>().As<CustomerModel>();
Mapper.CreateMap<CustomerModel, ICustomer>().As<CustomerDTO>();

CustomerModelただし、これをへのマッピングなど、別のレイヤーに拡張するCustomerViewModelと、これは崩壊します。AutoMapper には、インスタンス化に使用する宛先タイプを 1 つだけ指定できます。

しかし、上記のコメントと同様に、これらの他のクラス内でインターフェイスとして型指定されたプロパティを持つ理由を疑問視します。なぜプロパティCustomerOrderModelを持つ必要があるのですか?ICustomer customercustomer を a のインスタンスに置き換えCustomerDTOても、プログラムは正しく動作しますか? 顧客を含むオブジェクトに共通の動作がある場合、それらの親オブジェクトにインターフェイスを実装させることができますICustomerAccessor。次に、明示的なインターフェイスの実装を使用して、より弱い型指定のプロパティを追加します。名前に干渉する必要はありません。

于 2015-11-25T21:09:55.913 に答える