Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向Windsor Castle中的组件依赖项添加符号_C#_Dependency Injection_Castle Windsor_Ioc Container - Fatal编程技术网

C# 向Windsor Castle中的组件依赖项添加符号

C# 向Windsor Castle中的组件依赖项添加符号,c#,dependency-injection,castle-windsor,ioc-container,C#,Dependency Injection,Castle Windsor,Ioc Container,我有两个组件(AWriter和BWriter),它们都实现了IWriter接口。我有两个组件(AComponent和BComponent),它们都实现接口IComponent,并且都依赖于IWriter。但在组件中,我想告诉温莎给我一个writer的实例,在b组件中,我想告诉温莎给我一个BWriter的实例。怎么做 代码如下: public interface IWriter { void Write(); } public class AWriter

我有两个组件(AWriter和BWriter),它们都实现了IWriter接口。我有两个组件(AComponent和BComponent),它们都实现接口IComponent,并且都依赖于IWriter。但在组件中,我想告诉温莎给我一个writer的实例,在b组件中,我想告诉温莎给我一个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();
        }
    }
注意:这只是一个简化的问题,将A编写器放在组件中,将B编写器放在B组件中作为依赖项不是一个选项。同样,在本例中,A组件和B组件可能看起来相同,但这不是真实情况。在实际情况中,我有更多的依赖项和组件,我不想为此烦恼


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

您希望使用命名组件和服务覆盖。有关帮助,请参见温莎的文档:

使用fluent注册,您可以执行以下操作:

container.Register(Component.For<IComponent>()
                            .ImplementedBy<AWriter>().Named("AWriter"),
                   Component.For<IComponent>()
                            .ImplementedBy<BWriter>().Named("BWriter"));
container.Register(Component.For())
.ImplementedBy().Named(“AWriter”),
用于()的组件
.ImplementedBy().Named(“BWriter”);
然后:

container.Register(Component.For())
.由()实施
.ServiceOverrides(
ServiceOverride.ForKey(“writer”).Eq(“AWriter”);
container.Register(Component.For())
.由()实施
.ServiceOverrides(
ServiceOverride.ForKey(“writer”).Eq(“BWriter”);
当然,这将导致IComponent的两个注册,但是如果需要注入特定实例,您可以命名它们,并使用服务覆盖将每个实现注入到依赖关系结构中的相应位置。

可能的重复项
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"));