在温莎装饰命名组件
本文关键字:组件 | 更新日期: 2023-09-27 18:03:48
我的程序集包含多个IFoo实现。其中一个实现是decorator 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,我应该有这样的注册:
- FooDecorator实现的IFoo组件 Foo1实现的IFoo组件名为Foo1Foo2实现的IFoo组件名为Foo2
- //FooDecorator实现的IFoo组件名为FooDecorator<——不确定,因为这是重复的
现在我的工厂将解析如下组件:
container.Resolve("Foo1")
并且我想接收由FooDecorator装饰的Foo1。有什么办法可以实现这样的装饰吗?我做错了什么吗?
如果你决定使用拦截器,配置应该为你工作
container.Register(
Component.For<FooInterceptor>(),
Classes.FromAssembly()
.BasedOn<IFoo>()
.Configure(c => c.Interceptors<FooInterceptor>())
.Configure(c => c.Named(c.Implementation.Name)));
当然你必须实现你的FooInterceptor实现IInterceptor
你还应该考虑用TypedFactory