Al tratar de implementar el patrón de repositorio me he encontrado con un problema menor que me preocupa, en realidad oculta problemas mayores.Fundición, genéricos y subtipos
Tengo una DatabaseEntity <T>
que estoy usando para manejar todas las operaciones básicas de CRUD y de la cual descenderán todas las otras clases que necesitan almacenarse en una base de datos. Está funcionando bien para las clases que heredan directamente de él, sin embargo, al usarlo con clases que tienen un padre intermedio, me he encontrado con un problema.
Supongamos que tengo otras tres clases, los padres, Childa y Parto de y y la heredad será similar a:
DatabaseEntity
|
Padres
| |
Childa Parto de
también suponer que DatabaseEntity <T>
tiene un método con la siguiente firma:
public static T FindBy(int id)
El problema que estoy teniendo es cuando intento algo como:
ChildA Foo = ChildA.FindBy(SomeID);
I obtener un error de compilación que me dice que no hay una conversión implícita de un Parent a un ChildA. Esto se debe a que Parent es la clase que se transfiere para el parámetro tipo a DatabaseEntity para ChildA y ChildB. Solución fácil, creo, solo agregue un parámetro de tipo a Parent pasando por el tipo apropiado. Solo espere un segundo, luego tendré que definir explícitamente el subtipo cada vez que use Parent que arruine cualquier polimorfismo. No, pensándolo bien, quizás esa no sea una gran solución.
Creo que acabo podría caer el parámetro de tipo en el propio DatabaseEntity clase y tienen cada método requiere un parámetro de tipo, pero entonces tendría que hacer algo como:
ChildA Foo = ChildA.FindBy<ChildA>(SomeID);
Mientras que compila, se parece menos limpio y ciertamente requiere más tipeo. Visual Studio pregunta si me falta un molde y mientras su verdadero tan sólo pudiera emitir mi primer ejemplo su sólo una cuestión de tiempo antes de que accidentalmente escribir a máquina:
ChildB Foo = (ChildB) ChildA.FindBy(SomeID)
No estoy especialmente satisfecho con cualquiera de los soluciones que he pensado hasta ahora y espero que alguien aquí pueda señalar una elegante que me he perdido.
¿Con qué versión de .NET está limitado? – Adrian
necesita un ORM que admita operaciones LINQ, luego puede usar 'OfType' para hacer la conversión entre parent a childa. –
RPM1984