【问题标题】:Decorating named components in windsor在 Windsor 中装饰命名组件
【发布时间】:2014-05-18 13:28:21
【问题描述】:

我的程序集包含多个 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 的 Foo1 实现的 IFoo 组件
  3. 由名为 Foo2 的 Foo2 实现的 IFoo 组件
  4. // 由名为 FooDecorator 的 FooDecorator 实现的 IFoo 组件

现在我的工厂将解析如下组件:

container.Resolve("Foo1")

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

【问题讨论】:

  • 不确定您的目标。您想要解析 IFoo 并确保获得装饰器,还是想要获得特定的 IFoo 而不管装饰器?
  • @CristianoDegiorgis 我想解析名为“Foo1”的 IFoo 并让 Foo1 由 FooDecorator 装饰。我已通过示例注册更新了我的问题。
  • 看来你不想要一个装饰器,而是一个拦截器。
  • @CristianoDegiorgis 是的,我认为拦截器会起作用。然而这个装饰器已经存在了,我只需要连接起来。

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


【解决方案1】:

如果您决定使用拦截器,该配置应该适合您

container.Register(
    Component.For<FooInterceptor>(),
    Classes.FromAssembly()
        .BasedOn<IFoo>()
        .Configure(c => c.Interceptors<FooInterceptor>())
        .Configure(c => c.Named(c.Implementation.Name)));

当然你必须实现你的 FooInterceptor 实现 IInterceptor

您还应该考虑将您的工厂替换为TypedFactory

【讨论】:

  • 我真的很喜欢这个解决方案,不幸的是我需要使用装饰器。 +1 类型工厂,很酷的东西。
猜你喜欢
  • 2016-09-14
  • 2017-11-13
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 2015-10-06
  • 2010-10-12
相关资源
最近更新 更多