2011-02-17 68 views
2

以下情形:温莎城堡地图命名组件特定的属性

我们用流利的API来注册在装配和两个部件tyepof(A)与名为键的所有组件。另一个具有两个typeof(A)属性的类B应该注入已命名的组件。

样品:

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 

这是可能与属性像命名或仅与XML配置?

+0

顺便说一句`B`应该注入`IA`,而不是具体的`A` – 2011-02-17 15:29:16

+0

没错,这实际上是我想要输入的内容。 ;) 修复。 – 2011-02-18 14:02:37

回答

4

在温莎这样做的标准方法是使用service overrides。在您的例子,当你注册B你会做这样的:

container.Register(Component.For<IB>().ImplementedBy<B>() 
        .ServiceOverrides(new {First = "first", Second = "second"})); 

(还有其他的方式来表达这一点,检查链接的文档)

使用Named属性为您提出污染与无关的担忧代码(B不应该关心什么A小号获得注入)

1

这里是你将如何解决使用DependsOn并纳入nameof表达(介绍了C#6.0)这个问题:

container.Register 
(
    Component.For<IA>() 
     .Instance(new A(value1)) 
     .Named("first"), 
    Component.For<IA>() 
     .Instance(new A(value2)) 
     .Named("second"), 
    Component.For<IB>() 
      .ImplementedBy<B>() 
      .DependsOn 
      (
       Dependency.OnComponent(nameof(B.First), "first"), 
       Dependency.OnComponent(nameof(B.Second), "second") 
     )  
) 

Dependency.OnComponent有许多覆盖,但在这种情况下,第一个参数是属性名称,第二个参数是组件名称。

有关更多文档,请参阅here