Necesito un asignador de objetos para objeto en mi aplicación. He probado algunos, pero no he podido encontrar nada que se ajuste a mis necesidades, así que estoy escribiendo el mío. Actualmente tengo una interfaz como a continuación:Objeto basado en genéricos de C# para la consulta del asignador de objetos
public interface IMapper<T, R> {
T Map(R obj);
}
entonces implementar un AccountMapper que se asigna un cliente a una cuenta como:
public class AccountMapper : IMapper<Account, Customer> {
Account Map(Customer obj) {
// mapping code
}
}
Esto funciona bien hasta el momento, sin embargo, tengo varias entidades de origen que se asignan a la misma entidad de destino Por ejemplo, tengo un pago y una factura que se asignan a BillHistory. Para que lo anterior lo soporte, necesito hacer dos mapeadores por separado (es decir, BillHistoryPaymentMapper y BillHistoryInvoiceMapper), lo cual está bien. Sin embargo, me encantaría poder implementarlo de forma ligeramente diferente, como a continuación. El único problema es que no sé si es posible y, de ser así, no sé la sintaxis correcta.
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
}
}
Si bien la primera implementación funciona bien, la segunda sería un poco más elegante. ¿Es esto posible y, en caso afirmativo, cómo sería la sintaxis correcta?
edición -------
No me gusta cuando la gente hace esto, pero por supuesto se me olvidó mencionar un pequeño detalle. Tenemos una clase abstracta entre el mapeador y la interfaz para implementar una lógica común en todos los mapeadores. Así que mi firma asignador es en realidad:
public class BillHistoryMapper : Mapper<BillHistory, Invoice> {
}
donde Mapper contiene:
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));
}
}
ver texto de arriba, el código no se muestra correctamente en el código comentario – Brian
poner en práctica el método de mapa como un método de extensión en la interfaz IMapper. De esta forma, no tiene que usar una clase base abstracta. –
He marcado esto como la respuesta b/c que respondió a mi pregunta original. También pude lograr esto sin una clase abstracta usando la sugerencia de Eric. ¡¡¡Gracias!!! – Brian