У меня есть интерфейс (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();
Edit
После получения первой пары ответов я хочу уточнить это немного.
Я не хочу создавать отдельные классы для бита 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>
Но я не хочу создавать сопоставление для каждого из них, 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>>();
Я хочу одно сопоставление, которое будет работать для любого IRepository:
For<IRepository<>>().Use<Repository<>>().WithTheSameGenericType();
Затем я использовал бы это, чтобы внедрить репозитории в службы:
public MyService(IRepository<User> userRepository)
И ожидаем, что это будет разрешено для Repository<User>
во время выполнения.