【发布时间】: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 我应该有这样的注册:
- 由 FooDecorator 实现的 IFoo 组件
- 由名为 Foo1 的 Foo1 实现的 IFoo 组件
- 由名为 Foo2 的 Foo2 实现的 IFoo 组件
- // 由名为 FooDecorator 的 FooDecorator 实现的 IFoo 组件
现在我的工厂将解析如下组件:
container.Resolve("Foo1")
我想收到由 FooDecorator 装饰的 Foo1。 有没有办法实现这样的装饰?我做错了吗?
【问题讨论】:
-
不确定您的目标。您想要解析 IFoo 并确保获得装饰器,还是想要获得特定的 IFoo 而不管装饰器?
-
@CristianoDegiorgis 我想解析名为“Foo1”的 IFoo 并让 Foo1 由 FooDecorator 装饰。我已通过示例注册更新了我的问题。
-
看来你不想要一个装饰器,而是一个拦截器。
-
@CristianoDegiorgis 是的,我认为拦截器会起作用。然而这个装饰器已经存在了,我只需要连接起来。
标签: c# inversion-of-control castle-windsor