【问题标题】:Adding notation to component dependency in Windsor Castle在 Windsor Castle 中为组件依赖添加符号
【发布时间】:2011-09-01 08:35:13
【问题描述】:

我有 2 个组件(AWriter 和 BWriter),它们都实现了 IWriter 接口。我有 2 个组件(AComponent 和 BComponent),它们都实现接口 IComponent 并且都依赖于 IWriter。但是在 AComponent 中我想告诉 Windsor 给我 AWriter 的实例,而在 BComponent 中我想告诉 Windsor 给我 BWriter 的实例。该怎么做?

代码如下:

public interface IWriter
    {
        void Write();
    }

    public class AWriter : IWriter
    {
        public void Write()
        {
            Console.Write("A writer");
        }
    }

    public class BWriter : IWriter
    {
        public void Write()
        {
            Console.Write("B writer");
        }
    }

    public interface IComponent
    {
        void Do();
    }

    public class AComponent : IComponent
    {
        IWriter writer;

        public AComponent(IWriter writer)
        {
            this.writer = writer;
        }

        public void Do()
        {
            writer.Write();
        }
    }

    public class BComponent : IComponent
    {
        IWriter writer;

        public BComponent(IWriter writer)
        {
            this.writer = writer;
        }

        public void Do()
        {
            writer.Write();
        }
    }

注意:这只是一个简化的问题,将 AWriter 放在 AComponent 中,将 BWriter 放在 BComponent 中作为依赖项不是一种选择。 AComponent 和 BComponent 在此示例中可能看起来相同,但这不是真实情况。在实际情况下,我有更多的依赖项和组件,我不想为此烦恼。

那么,有没有办法通过某个属性指定 Castle 应该给我哪个实现?

【问题讨论】:

标签: c# dependency-injection castle-windsor ioc-container


【解决方案1】:

您希望使用命名组件和服务覆盖。请参阅 Windsor 文档中的此处以获取帮助:http://docs.castleproject.org/Windsor.Registering-components-one-by-one.ashx

使用流利的注册你会做这样的事情:

container.Register(Component.For<IComponent>()
                            .ImplementedBy<AWriter>().Named("AWriter"),
                   Component.For<IComponent>()
                            .ImplementedBy<BWriter>().Named("BWriter"));

然后:

container.Register(Component.For<IComponent>()
                            .ImplementedBy<AComponent>()
                            .ServiceOverrides(
                                ServiceOverride.ForKey("writer").Eq("AWriter"));
container.Register(Component.For<IComponent>()
                            .ImplementedBy<BComponent>()
                            .ServiceOverrides(
                                ServiceOverride.ForKey("writer").Eq("BWriter"));

当然,这将导致 IComponent 的两次注册,但同样,如果您需要注入特定实例,您可以命名它们并使用服务覆盖将每个实现注入到依赖结构中的适当位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多