Имеются следующие классы / интерфейсы:
class Repository<T> : IRepository<T> {}
class UserRepository : Repository<User>, IUserRepository {}
Есть ли простой способ преобразовать это:
container.Register(
Component.For<IUserRepository>()
.Forward<IRepository<User>>()
.ImplementedBy<UserRepository>()
);
В автоматическую регистрацию через AllTypes? Пока что мне не хватает переадресации.
container.Register(
AllTypes.FromAssemblyContaining(typeof(IUserRepository))
.BasedOn(typeof(Repository<>))
.WithService.Select((t, b) => new List<Type> {
t.GetInterfaces().Where( x => !x.IsGenericType ).FirstOrDefault()
})
);
а с пересылкой типа? Так что это будет работать:
container.Resolve<IUserRepository>().GetType() == container.Resolve<IRepository<User>>().GetType()
Следующий код не совсем работает, так как FirstInterface () возвращает IRepository :
container.Register(
AllTypes.FromAssemblyContaining(typeof(IUserRepository))
.BasedOn(typeof(Repository<>))
.WithService.FirstInterface()
);
Редактировать: я был довольно близко, поэтому в моем случае:
container.Register(
AllTypes.FromAssemblyContaining(typeof(IUserRepository))
.BasedOn(typeof(Repository<>))
.WithService.Select((t, b) => new List<Type> {
t.GetInterfaces()
})
);