在windsor中装饰命名组件

时间:2014-05-18 13:28:21

标签: c# inversion-of-control castle-windsor

我的程序集包含多个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,我应该有这样的注册:

  1. 由FooDecorator实施的IFoo组件
  2. 由Foo1实现的IFoo组件名为Foo1
  3. 由Foo2实现的IFoo组件名为Foo2
  4. //由FooDecorator实现的IFoo组件名为FooDecorator &lt; - 不确定,因为这是重复的
  5. 现在我的工厂将解决如下组件:

    container.Resolve("Foo1")
    

    我想收到FooDecorator装饰的Foo1。 有没有办法实现这样的装饰?我做错了吗?

1 个答案:

答案 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

替换您的工厂