在Castle Windsor实施和解决许多服务装饰

时间:2010-05-05 15:30:29

标签: c# castle-windsor decorator

我是Castle Windsor的新手,所以我不确定在以下情况下最佳做法是什么: 我有一个服务接口(ILoader),由多个Loader类实现。我还有一个ILoader的实现,它是一个装饰器:

public interface ILoader { }
public class LoaderImpl0 : ILoader { }
public class LoaderImpl1 : ILoader { }
public class CachedLoader : ILoader
{
    public CachedLoader(ILoader inner) { }
}

对于每个LoaderImpl ...类,我想在我的容器中注册一个CachedLoader,它装饰一个LoaderImpl ...实例。

这是我的第一次垃圾尝试:

container.Register
(
    Component.For<LoaderImpl0>().Named("loader0"),
    Component.For<LoaderImpl1>().Named("loader1"),
    Component
    .For<ILoader>( )
    .ImplementedBy<CachedLoader>( )
    .ServiceOverrides( ServiceOverride.ForKey( "inner" ).Eq( "loader0" ) )
    .Named("cachedLoader0"),
    Component
    .For<ILoader>()
    .ImplementedBy<CachedLoader>()
    .ServiceOverrides(ServiceOverride.ForKey("inner").Eq("loader1"))
    .Named("cachedLoader1")
);

这似乎错了,有两个方面:

  • container.ResolveAll<ILoader>()返回所有4个已注册的加载器(即使我没有使用ILoader服务注册LoaderImpl ...类)。
  • 这似乎是一种非常笨拙的方式来定义什么是非常常见的嵌套关系 - 我真的不关心LoaderImpl ...类,它们应该真的是匿名的。

有人可以告诉我哪里出错了吗?

0 个答案:

没有答案