我需要一个对象来在我的应用程序中对象映射器.我已经尝试了一些,但是没有找到符合我需要的任何东西,所以我正在写我自己的.目前我有一个如下的界面:
public interface IMapper<T,R> { T Map(R obj); }
然后我实施一个将客户映射到帐户的AccountMapper:
public class AccountMapper : IMapper<Account,Customer> { Account Map(Customer obj) { // mapping code } }
这到目前为止工作正常,但是我有几个源实体映射到同一个目标实体.例如,我有一个付款和发票,都映射到BillHistory.为了支持这一点,我需要制作两个独立的映射器(比如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 } }
虽然第一次实施工作正常,但第二次将稍微优雅.这是否可能,正确的语法会是什么样子?
编辑 – – – –
我讨厌当人们这样做,但当然我忘了提一点细节.我们在映射器和接口之间有一个抽象类,以实现所有映射器的一些常见逻辑.所以我的mapper签名实际上是:
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)); } }
解决方法
您将不得不使用您的第一个界面并在对象上多次实现界面:
public class BillHistoryMapper : IMapper<Account,Invoice>,IMapper<Account,Payment> { ... }
我会认真考虑看看AutoMapper而不是写自己的.映射中有很多细微差别已经解决了,更不用说通过大量的性能测试,错误修复等.