Dependency injection 温莎城堡命名组件注册令

Dependency injection 温莎城堡命名组件注册令,dependency-injection,inversion-of-control,castle-windsor,ioc-container,Dependency Injection,Inversion Of Control,Castle Windsor,Ioc Container,我在尝试解析命名组件时遇到问题。根据Castle文档,它指出当多个组件具有相同的依赖关系时,首先选择第一个注册的组件 为了避免这种情况,我使用命名组件为相同的依赖项解析它们 container.Register(Component.For<DataContext>().ImplementedBy<MyContext>() .Named("Db1").DependsOn(Property.ForKey<string>() .Eq(Configurat

我在尝试解析命名组件时遇到问题。根据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.Resolvecbo.SelectedItem.ToString;如果cbo是一个组合框控件,无论选择哪个选项,我都会注册第一个组件。

这太多了,无法在注释中添加。温莎版本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的实例。您是否可以创建一个失败的测试用例来突出您的问题?

这太多了,无法在评论中加以说明。温莎版本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的实例。你能创建一个失败的测试用例来突出你的问题吗?

你不需要property.ForKey[propertyName]中的属性名称吗?当我在调试模式下单步执行时,我在MyContext中设置了所需的连接字符串,但最后总是注册了第一个组件。您确定cbo.SelectedItem.ToString返回的是Db1还是Db2?您不需要property.ForKey[propertyName]中的属性名称吗?当我在调试模式下逐步执行时,我在MyContext中设置了所需的连接字符串,但最后总是注册了第一个组件。您确定cbo.SelectedItem.ToString返回的是Db1还是Db2?Patrick,我的操作与您在回答中发布的相同。两个DataContext对象根据各自的名称按预期进行解析。在深入研究局部变量时,我注意到我的存储库类,Castle.Core.ComponentModel中的名称,都解析为容器中第一个注册的DataContext。我需要写我自己的ISubDependencyResolver来解决这个问题吗?Patrick,我做的和你在回答中发布的一样。两个DataContext对象根据各自的名称按预期进行解析。在深入研究局部变量时,我注意到我的存储库类,Castle.Core.ComponentModel中的名称,都解析为容器中第一个注册的DataContext。我是否需要编写自己的ISubDependencyResolver来修复此问题?