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)));

次に、 conrtol のkernel.Resolve<DataContext>(cbo.SelectedItem.ToString());場所を呼び出します。どのオプションが選択されていても、常に最初のコンポーネントが登録されます。cboComboBox

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は「1」の項目でf2インスタンスを参照し、「2」の項目でインスタンスを参照しました。問題を強調する失敗したテスト ケースを作成できますか?

于 2012-06-13T21:41:41.533 に答える