我的程序集包含多个IFoo实现。其中一个实现是装饰器FooDecorator。另外我有FooFactory,我想解决由FooDecorator装饰的所有Foos。我认为最好的方法是按名称解析组件。我目前的注册如下:
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")
我想收到FooDecorator装饰的Foo1。 有没有办法实现这样的装饰?我做错了吗?
答案 0 :(得分:1)
如果你决定使用拦截器配置应该适合你
container.Register(
Component.For<FooInterceptor>(),
Classes.FromAssembly()
.BasedOn<IFoo>()
.Configure(c => c.Interceptors<FooInterceptor>())
.Configure(c => c.Named(c.Implementation.Name)));
当然,您必须实现实现IInterceptor的FooInterceptor
您还应该考虑用TypedFactory
替换您的工厂