Регистрация / разрешение частично закрытого универсального потомка с использованием открытого универсального типа предка с Castle Windsor

С классом предков:

abstract class MyOpenGenericAncestor<T, TOptions>

и потомок класса:

class MyPartiallyClosedDescendant<T> : MyOpenGenericAncestor<T, MyConcreteOptionsType>

Я хочу иметь возможность разрешать MyPartiallyClosedDescendant с помощью MyOpenGenericAncestor, например:

MyOpenGenericAncestor<T, TOptions> ResolveGeneric<T, TOptions>(TOptions options)
{
    // assume options are used for stuff
    return _container.Resolve<MyOpenGenericAncestor<T, TOptions>();
}

Есть ли способ сделать это? В текущей реализации этого кода регистрация выглядит следующим образом:

var assemblyFilter = new AssemblyFilter("C:\\thePath\", "MyStuff.*.dll");
var myTypes = Classes
    .FromAssemblyInDirectory(assemblyFilter)
    .BasedOn(typeof(MyOpenGenericAncestor<,>))
    .WithServiceBase()
    .LifestyleTransient();

container.Register(myTypes);

С этой регистрацией MyPartiallyClosedDescendant регистрируется как компонент, но вызов ResolveGeneric(myConcreateOptionsInstance) вызывает исключение Castle.MicroKernel.ComponentNotFoundException с сообщением о том, что ни один компонент для поддержки службы MyOpenGenericAncestor`2[MyConcreateTypeyTypeyTypeypeedType> не найден. Получение этого исключения имеет смысл, но есть ли способ зарегистрировать и / или разрешить потомка, запросив предка?

1 ответ

Решение

В замке для этой цели есть IGenericImplementationMatchingStrategy. К сожалению, я не уверен, как использовать это с регистрацией соглашения, так по крайней мере это...

public class MyOpenGenericAncestorMatchingStrategy : IGenericImplementationMatchingStrategy
{
    public Type[] GetGenericArguments(ComponentModel model, CreationContext context)
    {
        return new[] { context.GenericArguments[1] };
    }
}

container.Register(Component.For(typeof(MyOpenGenericAncestor<,>))
.ImplementedBy(typeof(MyPartiallyClosedDescendant<>), new MyOpenGenericAncestorMatchingStrategy()));
Другие вопросы по тегам