2009-07-08 15 views

Respuesta

1

Es muy posible, pero o bien no debe utilizar una interfaz común o hacer un montón de fundición. Usando una interfaz ...

public interface IRepository 
{ 
    public object Get(int id); // or object id 
    public void Save(object obj); 
} 

public class CustomerRepository : IRepository 
{ 
    public object Get(int id) { // implementation } 
    public void Save(object obj) { // implementation } 
} 

Esto funciona bien, pero tiene código de llamada para echar a los objetos del tipo correcto y métodos en implementaciones concretas tiene que comprobar el tipo y lanzar excepciones. La transmisión directa está pidiendo excepciones de tiempo de ejecución, así que evitaría este enfoque.

El enfoque que recomendaría es que sus repositorios no implementen una interfaz común. En cambio, pídales que implementen métodos comúnmente nombrados por convención.

public class CustomerRepository 
{ 
    public Customer Get(int id) { // implementation } 
    public void Save(Customer entity) { // implementation } 
} 

public class EmployeeRepository 
{ 
    public Employee Get(int id) { // implementation } 
    public void Save(Employee entity) { // implementation } 
} 

Editado para agregar: He vuelto a leer la respuesta vinculada. El último párrafo completo me pierde, pero puedo ampliar un poco el uso de DI. En la mayoría de los casos, no tendría sentido utilizar DI para inyectar un repositorio "genérico" (en este caso, significado derivado de una interfaz común). Además de los métodos comunes, un repositorio tendrá métodos específicos de la entidad como GetCustomersWithPastDueAccounts. Podría definir un ICustomerRepository con ese método y hacer que su CustomerRepository lo implemente. Luego, podría usar la inyección de dependencia para inyectar CustomerRepository en tiempo de ejecución. No hay nada de malo en eso, pero en mi experiencia es bastante raro que tenga múltiples implementaciones de un repositorio, así que no tiene mucho sentido hacerlo.

+0

Pero con su segundo enfoque, ¿no pierdo la capacidad de inyectar dependencias? –

+1

Siempre puede hacer la inyección de dependencia manual. Pero tiene razón, no podría usar un marco DI para hacer la inyección de dependencia. Editaré mi respuesta y añadiré más explicaciones. –

+0

Entonces, básicamente, hay una interfaz para cada repositorio, y eso se puede usar para DI. Para 10 entidades, 10 interfaces, con al menos 10 implementaciones. ¿Suena bien? –

0

a menos que malinterprete algo, la respuesta aceptada en la pregunta que vinculó no usa genéricos. Está definiendo una interfaz y utilizando el término "genérico" para indicar que la interfaz no está vinculada directamente a ninguna tabla específica en el modelo.

+0

No creo que sea el caso, pero si lo es, ¿cómo se verían las firmas de esas 7 funciones en IEntityRepository? –

+1

Se refiere a la implementación del repositorio que usa la interfaz IRepository . –

Cuestiones relacionadas