在温莎装饰命名组件

本文关键字:组件 | 更新日期: 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,我应该有这样的注册:

  1. FooDecorator实现的IFoo组件
  2. Foo1实现的IFoo组件名为Foo1Foo2实现的IFoo组件名为Foo2
  3. //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

代替你的工厂