Я использую Castle Windsor 4.1.1 и для своего случая использования я регистрирую открытые дженерики.Контейнер работает и может разрешать все классы, но проверка контейнера не может с этим справиться.Проблема в том, что когда открытый универсальный класс получает универсальный тип в качестве аргумента конструктора, тогда валидатор имеет потенциальные несоответствия для каждого класса, в котором он используется, и для любой зависимости используется открытый универсальный тип.
Я использовалПроверка контейнера, описанная здесь: Замок Виндзор: есть ли способ проверки регистрации без вызова разрешения?
Обходной путь: не использовать универсальные аргументы открытых обобщений в конструкторе или дляполностью отключи валидацию, которая у меня не работает.Могу ли я сделать что-нибудь, чтобы получить функционал валидатора в этом сценарии?
Настройка контейнера:
var c = new WindsorContainer();
var collectionResolver = new CollectionResolver(c.Kernel);
c.Kernel.Resolver.AddSubResolver(collectionResolver);
c.Register(Component
.For(typeof(IOpenGeneric<>))
.ImplementedBy(typeof(OpenGenericImpl<>))
.LifestyleTransient()
);
c.Register(Component
.For<MyProfile>()
.LifestyleTransient()
);
c.Register(Component
.For<MyClass>()
.LifestyleTransient()
);
c.Register(Component
.For<MyOtherClass>()
.LifestyleTransient()
);
Образцы классов:
class MyOtherClass
{
private readonly MyClass _cls;
public MyOtherClass(MyClass cls)
{
_cls = cls;
}
}
class MyClass
{
private readonly IOpenGeneric<MyProfile> _s;
public MyClass(IOpenGeneric<MyProfile> s)
{
_s = s;
}
}
class Profile
{
}
class MyProfile : Profile
{
}
interface IOpenGeneric<out T>
where T : Profile
{
}
class OpenGenericImpl<T> : IOpenGeneric<T>
where T : Profile
{
private readonly T _t;
public OpenGenericImpl(T t)
{
_t = t;
}
}