C# 向Windsor Castle中的组件依赖项添加符号
我有两个组件(AWriter和BWriter),它们都实现了IWriter接口。我有两个组件(AComponent和BComponent),它们都实现接口IComponent,并且都依赖于IWriter。但在组件中,我想告诉温莎给我一个writer的实例,在b组件中,我想告诉温莎给我一个BWriter的实例。怎么做 代码如下: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
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"));