У меня есть интерфейс (IRepository<T>
), который в настоящее время расширяется для каждого конкретного хранилища, то есть: IUserRepository : IRepository<User>
.
Каждый из этих интерфейсов имеет соответствующие конкретные классы, а именно: UserRepository : Repository<User>, IUserRepository
.
Эти отдельные репозитории не добавляют никакой дополнительной функциональности, все они являются пустыми интерфейсами / классами, которые используются просто для передачи обобщений.
Я использую StructureMap для преобразования IUserRepository
в UserRepository
, используя реестр со сканером сборки и некоторыми соглашениями об именах.
Я бы хотел, чтобы это перешло в более оптимизированное состояние, где вместо прохождения экземпляров IUserRepository
и получения разрешения до UserRepository
я могу обойти IRepository<User>
и разрешить до Repository<User>
.
Это избавит от необходимости создавать эти дополнительные пустые интерфейсы и классы.
Я не могу найти способ использовать конфигурацию StructureMap для настройки этого общего отображения. Примерно так:
For(typeof(IRepository<>).Use(typeof(Repository<>)).WithTheGenericTypeFromTheInterfaceSuppliedAsATypeParameter();
Редактировать
Получив первые пару ответов, я хочу уточнить это немного подробнее.
Я не хочу создавать отдельные классы для бита For
конфигурации. Я хочу, чтобы в моем коде были следующие классы / интерфейсы:
IRepository<T> where T : Entity
Repository<T> : IRepository<T> where T : Entity
Person : Entity
Product : Entity
Order : Entity
Whatever : Entity
И получить следующие сопоставления, достигнутые с условным обозначением:
IRepository<Person> => Repository<Person>
IRepository<Product> => Repository<Product>
IRepository<Order> => Repository<Order>
IRepository<Whatever> => Repository<Whatever>
Но я не хочу создать сопоставление для каждого, ала:
For<IRepository<Person>>().Use<Repository<Person>>();
For<IRepository<Product>>().Use<Repository<Product>>();
For<IRepository<Order>>().Use<Repository<Order>>();
For<IRepository<Whatever>>().Use<Repository<Whatever>>();
Я хочу одно отображение, которое будет работать для любого IRepository:
For<IRepository<>>().Use<Repository<>>().WithTheSameGenericType();
Я бы затем использовал это для добавления репозиториев в сервисы:
public MyService(IRepository<User> userRepository)
И ожидайте, что это будет разрешено до Repository<User>
во время выполнения.