tengo una interfaz (IRepository<T>
) que actualmente está siendo extendido para cada repositorio específico, es decir: IUserRepository : IRepository<User>
.resuelve automáticamente Interface <T> a Implementación <T> en StructureMap (sólo difieren por tipo T genérico)
Cada una de estas interfaces tiene clases concretas correspondientes, es decir: UserRepository : Repository<User>, IUserRepository
.
Estos repositorios individuales no agregan ninguna funcionalidad adicional, son todas interfaces/clases vacías que se utilizan simplemente para pasar los genéricos.
Uso StructureMap para resolver IUserRepository
en UserRepository
utilizando un Registro con un escáner de ensamblaje y algunas convenciones de nomenclatura.
me gustaría que esto se mueve a una forma de estado más optimizado, donde en lugar de pasar alrededor de las instancias de IUserRepository
y conseguir que se resolvió UserRepository
, puedo pasar alrededor IRepository<User>
y lo han resuelto Repository<User>
.
Esto eliminaría la necesidad de crear estas interfaces y clases adicionales vacías.
No puedo encontrar la forma de usar la configuración de StructureMap para configurar este mapeo genérico. Algo como esto:
For(typeof(IRepository<>).Use(typeof(Repository<>)).WithTheGenericTypeFromTheInterfaceSuppliedAsATypeParameter();
Editar
Después de conseguir el primer par de respuestas, quiero aclarar esto un poco más.
No deseo crear clases individuales para el bit For
de la configuración. Quiero tener las siguientes clases/interfaces en mi código:
IRepository<T> where T : Entity
Repository<T> : IRepository<T> where T : Entity
Person : Entity
Product : Entity
Order : Entity
Whatever : Entity
y tienen las siguientes asignaciones logrado con la convención:
IRepository<Person> => Repository<Person>
IRepository<Product> => Repository<Product>
IRepository<Order> => Repository<Order>
IRepository<Whatever> => Repository<Whatever>
Pero No quiero tener que crear una asignación para cada uno, Ala:
For<IRepository<Person>>().Use<Repository<Person>>();
For<IRepository<Product>>().Use<Repository<Product>>();
For<IRepository<Order>>().Use<Repository<Order>>();
For<IRepository<Whatever>>().Use<Repository<Whatever>>();
Quiero una sola asignación que se trabajar para cualquier IRepository:
For<IRepository<>>().Use<Repository<>>().WithTheSameGenericType();
me permitiría usar esto para poner los repositorios en los servicios de:
public MyService(IRepository<User> userRepository)
Y espera que se resuelva en un Repository<User>
en tiempo de ejecución.
Su configuración deseada ya es real (sin la necesidad de WithTheGenericTypeFromTheInterfaceSuppliedAsATypeParameter). ¿Lo intentaste y no funcionó? –
Debo haberlo hecho mal - al principio no compilaría, así que creo que estoy usando la versión genérica del método (aunque cuando escribí la pregunta usé el no genérico). Una de esas mañanas. –