Моя сборка содержит несколько реализаций IFoo. Одна из этих реализаций - декоратор FooDecorator. Кроме того, у меня есть FooFactory, который я хотел бы разрешить для всех Foos, украшенных FooDecorator. Я предположил, что лучшим способом будет решение компонентов по имени. Моя текущая регистрация выглядит так:
Component.For<IFooFactory>()
.ImplementedBy<WindsorFooFactory>()
.LifestyleSingleton(),
Component.For<IFoo>()
.ImplementedBy<FooDecorator>(),
AllTypes.FromThisAssembly()
.BasedOn<IFoo>()
.Configure(c => c
.Named(c.Implementation.Name))));
И реализация фабрики выглядит так:
public class WindsorFooFactory : IFooFactory
{
private readonly IKernel _container;
public WindsorFooFactory(IKernel container)
{
_container = container;
}
public IFoo NewFoo(Type fooType)
{
return _container.Resolve<IFoo>(fooType.Name);
}
public void ReturnFoo(IFoo foo)
{
_container.ReleaseComponent(foo);
}
}
Поэтому, если моя сборка содержит Foo1, Foo2 и FooDecorator, у меня должны быть такие регистрации:
Теперь мой завод будет решать такие компоненты, как:
container.Resolve("Foo1")
И я хотел бы получить Foo1, украшенный FooDecorator. Есть ли способ добиться такого украшения? Я делаю что-то неправильно?
Если вы решили использовать перехватчик, чтобы конфигурация работала для вас
container.Register(
Component.For<FooInterceptor>(),
Classes.FromAssembly()
.BasedOn<IFoo>()
.Configure(c => c.Interceptors<FooInterceptor>())
.Configure(c => c.Named(c.Implementation.Name)));
Конечно, вы должны реализовать свой FooInterceptor, реализующий IInterceptor
Вы должны также рассмотреть возможность замены своей фабрики TypedFactory