Ich habe ein Objekt Objekt Mapper in meiner Anwendung Objekt. Ich habe ein paar ausprobiert, aber ich konnte nichts finden, was meinen Bedürfnissen entspricht, also schreibe ich mein eigenes. Zur Zeit habe ich eine Schnittstelle wie unten:C# Generika-basierte Objekt zu Objekt-Mapper-Frage
public interface IMapper<T, R> {
T Map(R obj);
}
ich dann ein AccountMapper implementieren, die einen Kunden auf ein Konto abbildet als:
public class AccountMapper : IMapper<Account, Customer> {
Account Map(Customer obj) {
// mapping code
}
}
Das funktioniert so weit in Ordnung, aber ich mehrere Quelleneinheiten, die Karte zu derselben Zieleinheit. Zum Beispiel habe ich eine Zahlung und eine Rechnung, die beide BillHistory zuordnen. Um dies zu unterstützen, muss ich zwei separate Mapper erstellen (dh BillHistoryPaymentMapper und BillHistoryInvoiceMapper), was in Ordnung ist. Wie auch immer, ich würde es gerne etwas anders umsetzen, wie unten beschrieben. Das einzige Problem ist, dass ich nicht weiß, ob es möglich ist und wenn ja, ich kenne die richtige Syntax nicht.
Während die erste Implementierung gut funktioniert, wäre die zweite etwas eleganter. Ist das möglich und wenn ja, wie würde die korrekte Syntax aussehen?
bearbeiten -------
Ich hasse es, wenn Menschen dies tun, aber natürlich habe ich vergessen, ein kleines Detail zu erwähnen. Wir haben eine abstrakte Klasse zwischen dem Mapper und der Schnittstelle, um eine gemeinsame Logik für alle Mapper zu implementieren. Also meine Mapper Unterschrift 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));
}
}
siehe oben, der Code wurde im Kommentar nicht korrekt angezeigt – Brian
Sie implementieren Ihre Map-Methode als eine Erweiterungsmethode auf der IMapper-Schnittstelle. Auf diese Weise müssen Sie keine abstrakte Basisklasse verwenden. –
Ich habe dies als Antwort b/c markiert es meine ursprüngliche Frage beantwortet. Ich konnte dies auch ohne eine abstrakte Klasse mit Erics Vorschlag erreichen. Vielen Dank!!! – Brian