C# - Generika-basierten Objekt-zu-Objekt-mapper Frage

Habe ich die Notwendigkeit einer Objekt-zu-Objekt-mapper in meiner Anwendung. Ich habe versucht ein paar, aber nicht in der Lage, etwas zu finden, das passt zu meinen Bedürfnissen, also Schreibe ich meine eigenen. Derzeit habe ich eine Schnittstelle wie unten:

public interface IMapper<T, R> {
    T Map(R obj);
}

Ich dann implementieren eine AccountMapper, dass die Karten ein Kunde auf ein Konto wie:

public class AccountMapper : IMapper<Account, Customer> {
    Account Map(Customer obj) {
        //mapping code
    }
}

Dieser funktioniert so weit, aber ich habe mehrere Quell-Entitäten, die Karte, um die gleiche Ziel-Entität. Zum Beispiel habe ich eine Zahlung und eine Rechnung, dass beide anzeigen zu BillHistory. Für die oben genannten, um diese Unterstützung, die ich brauche, um zwei separate Mappern (zB. BillHistoryPaymentMapper und BillHistoryInvoiceMapper), was in Ordnung ist. Allerdings, ich würde lieben im Stande zu sein es zu implementieren, etwas anders wie unten. Problem ist nur ich weiß nicht, ob es möglich ist und wenn ja, weiß ich nicht die korrekte syntax.

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
    }
}

Während der ersten Umsetzung funktioniert gut, die zweite wäre etwas eleganter. Ist das möglich und wenn ja, was wäre die richtige syntax Aussehen?

Bearbeiten-------

Ich hasse es, wenn Menschen dies tun, aber natürlich habe ich vergessen zu erwähnen, ein kleines detail. Wir haben eine abstrakte Klasse, die zwischen dem mapper und die Schnittstelle zu implementieren, die einige gemeinsame Logik für alle Mapper. Also mein mapper Signatur ist eigentlich:

public class BillHistoryMapper : Mapper<BillHistory, Invoice> {
}

wo Mapper enthält:

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));
    }
}
InformationsquelleAutor Brian | 2010-05-13
Schreibe einen Kommentar