2

我在尝试解析命名组件时遇到问题。根据 Castle 文档,它指出当多个组件具有相同的依赖项时,首先选择第一个注册的组件。为同一服务注册更多组件

为了避免这种情况,我使用命名组件来解析它们以获得相同的依赖关系。

container.Register(Component.For<DataContext>().ImplementedBy<MyContext>()
   .Named("Db1").DependsOn(Property.ForKey<string>()
   .Eq(Configuration.ConnectionStrings["Db1"].ConnectionString)));

container.Register(Component.For<DataContext>().ImplementedBy<MyContext>()
   .Named("Db2").DependsOn(Property.ForKey<string>()
   .Eq(Configuration.ConnectionStrings["Db2"].ConnectionString)));

然后调用kernel.Resolve<DataContext>(cbo.SelectedItem.ToString());where cbois a ComboBoxconrtol,无论选择哪个选项,我总是会注册第一个组件。

4

1 回答 1

0

这太多了,无法发表评论。Windsor 版本 3 支持您想做的事情。这是我尝试过的,它奏效了:

public interface IFoo
{
    string Name { get; }
}

public class Foo : IFoo
{
    private readonly string item;

    public Foo(string item) { this.item = item; }

    public string Name { get { return this.item; } }
}

[TestMethod]
public void TestMethod1()
{
    var container = new WindsorContainer();
    container.Register(Component.For<IFoo>().ImplementedBy<Foo>().Named("F1").DependsOn(Property.ForKey<String>().Eq("one")));
    container.Register(Component.For<IFoo>().ImplementedBy<Foo>().Named("F2").DependsOn(Property.ForKey<String>().Eq("two")));

    var f1 = container.Resolve<IFoo>("F1");
    var f2 = container.Resolve<IFoo>("F2");
}

变量f1引用了带有“一”项的f2实例,并引用了带有“二”项的实例。你能创建一个失败的测试用例来突出你的问题吗?

于 2012-06-13T21:41:41.533 回答