アプリケーションでオブジェクトからオブジェクトへのマッパーが必要です。いくつか試してみましたが、自分のニーズに合ったものが見つからなかったので、自分で書いています。現在、私は以下のようなインターフェースを持っています:
public interface IMapper<T, R> {
T Map(R obj);
}
次に、顧客を次のようにアカウントにマップするAccountMapperを実装します。
public class AccountMapper : IMapper<Account, Customer> {
Account Map(Customer obj) {
// mapping code
}
}
これは今のところ問題なく機能しますが、同じ宛先エンティティにマップするソースエンティティがいくつかあります。たとえば、BillHistoryにマップするPaymentとInvoiceがあります。上記をサポートするには、2つの別々のマッパー(つまり、BillHistoryPaymentMapperとBillHistoryInvoiceMapper)を作成する必要があります。これは問題ありません。ただし、以下のように少し異なる方法で実装できるようにしたいと思います。唯一の問題は、それが可能かどうかわからないことです。可能であれば、正しい構文がわかりません。
public interface IMapper<T> {
T Map<R>(R obj);
}
public class BillHistoryMapper : IMapper<Account> {
public BillHistory Map<Invoice>(Invoice obj) {
// mapping code
}
public BillHistory Map<Payment>(Payment obj) {
// mapping code
}
}
最初の実装は正常に機能しますが、2番目の実装は少しエレガントになります。これは可能ですか?もしそうなら、正しい構文はどのようになりますか?
編集 - - - -
私は人々がこれをするのは嫌いですが、もちろん私は少し詳細に言及するのを忘れました。マッパーとインターフェースの間に抽象クラスがあり、すべてのマッパーに共通のロジックを実装します。したがって、私のマッパー署名は実際には次のとおりです。
public class BillHistoryMapper : Mapper<BillHistory, Invoice> {
}
Mapperに含まれる場所:
public abstract class Mapper<T, R> : IMapper<T, R> {
public IList<T> Map(IList<R> objList) {
return objList.ToList<R>().ConvertAll<T>(new Converter<T, R>(Map));
}
}