以下场景:
我们使用 Fluent API 来注册程序集中的所有组件以及具有命名键的两个组件 typeof(A)。另一个具有两个属性 typeof(A) 的类 B 应该获得注入(inject)的命名组件。
示例:
public class A : IA {}
public class B : IB
{
[Named("first")]
public IA First { get; set; }
[Named("second")]
public IA Second { get; set; }
}
// ...
container.Register(Component.For<IA>().Instance(new A(value1)).Named("first"));
container.Register(Component.For<IA>().Instance(new A(value2)).Named("second"));
// ...
var b = container.Resolve<IB>(); // named instances of A get injected to B using the Named attribute
这可以通过 Named 这样的属性实现还是仅通过 Xml Config 实现?
最佳答案
在 Windsor 中执行此操作的标准方法是使用 service overrides 。在您的示例中,当您注册 B
时,您将这样做:
container.Register(Component.For<IB>().ImplementedBy<B>()
.ServiceOverrides(new {First = "first", Second = "second"}));
(还有其他方式来表达这一点,请检查链接的文档)
按照您的建议使用 Named
属性会因不相关的问题而污染代码(B
不应该关心注入(inject)的 A
内容)
关于.net - CaSTLe Windsor 将命名组件映射到特定属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5030431/