У Castle Windsor Container Validation есть проблемы с открытыми генериками - PullRequest
0 голосов
/ 22 октября 2018

Я использую 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;
    }
}
...