Dependency injection IoC容器如何知道要注入哪个命名实例?

Dependency injection IoC容器如何知道要注入哪个命名实例?,dependency-injection,unity-container,Dependency Injection,Unity Container,当给定接口有多个命名实现时,容器(我在Prism应用程序中使用Unity)如何知道要注入哪一个,除非我调用容器。使用注册名称解析?下面是一个简单的例子: public interface IDependencyClass { void DoSomething(); } public class DependencyClassA : IDependencyClass { void DoSomething() { } } public class DependencyClassB

当给定接口有多个命名实现时,容器(我在Prism应用程序中使用Unity)如何知道要注入哪一个,除非我调用容器。使用注册名称解析?下面是一个简单的例子:

public interface IDependencyClass
{
    void DoSomething();
}

public class DependencyClassA : IDependencyClass
{
    void DoSomething() { }
}

public class DependencyClassB : IDependencyClass
{
    void DoSomething() { }
}

public interface IConsumer
{
    void TakeUserSpecificAction();
}

public class Consumer : IConsumer
{
    IDependencyClass dependencyInstance;
    public Consumer(IDependencyClass _dependencyInstance)
    {
        dependencyInstance = _dependencyInstance;
    }

    public void TakeUserSpecificAction()
    {
        dependencyInstance.DoSomething();
    }
}

public class MyBootStrapper : UnityBootstrapper
{

    protected override void ConfigureContainer()
    {
        base.ConfigureContainer();
        Container.RegisterType<IDependencyClass, DependencyClassA>( "InstanceA" );
        Container.RegisterType<IDependencyClass, DependencyClassB>( "InstanceB" );
        Container.RegisterType<IConsumer, Consumer>();
    }
}
我正在使用哪个DependencyClass实例?DependencyClassA或DependencyClassB。另外,如果我想特别使用DependencyClassB,我需要做些什么来实现它。我不想打电话

container.Reslove<IDependencyClass>("InstanceB") 
但是,我给消费者施加了一个硬约束,要求他们只使用“InstanceB”实现。第二,我正在创造一种对统一的依赖。第三,现在我必须克隆Consumer类以使用“InstanceA”实现。这违背了干燥原则

我听说这些条件是应用决定,而不是与国际奥委会相关的逻辑。我同意那个论点。但是,在应用程序中,我在哪里以及如何解决正确的实现而不违反一条或另一条规则


除非我选择使用上面两个选项中的一个,否则我看不出如何注入正确的具体实例。容器。解析或依赖属性。有人能帮忙吗?

您何时以及如何创建
消费者类?您提到选择哪个依赖项取决于一些运行时信息,这些信息是什么?在这种情况下,工厂解决方案为什么不起作用?您只需将运行时信息传递到工厂
Create
方法中即可。@Yacoub:您是这里为数不多的几个真正试图帮助我解决其他问题的人之一。非常感谢。我修改了我的问题,以包含更多信息和代码。这是一个使用Prism和Unity的WPF应用程序。我的Consumer类得到一个IDependencyClass实例。此实例需要根据登录用户的不同而有所不同。这就是我遇到麻烦的地方。我听说工厂能帮上忙。但我不知道该怎么做。你能帮我查一下工厂代码吗。再次感谢。这些不是真正的代码。是我编的。但我希望这是有道理的。@Yacoub-我想避免的事情很少有1.避免将容器四处传递(甚至进入工厂)。2.在工厂内更新混凝土等级。3.使用Activator.CreateInstance-实际上是更新实例。我想,不知何故,神奇的是,团结可以实现好莱坞的原则(“不要打电话给我们,我们会打电话给你”)。我最终在工厂里使用了2号。如果你以答案的形式发布,我可以将你的建议标记为接受。再次感谢您。您何时以及如何创建
消费者
类?您提到选择哪个依赖项取决于一些运行时信息,这些信息是什么?在这种情况下,工厂解决方案为什么不起作用?您只需将运行时信息传递到工厂
Create
方法中即可。@Yacoub:您是这里为数不多的几个真正试图帮助我解决其他问题的人之一。非常感谢。我修改了我的问题,以包含更多信息和代码。这是一个使用Prism和Unity的WPF应用程序。我的Consumer类得到一个IDependencyClass实例。此实例需要根据登录用户的不同而有所不同。这就是我遇到麻烦的地方。我听说工厂能帮上忙。但我不知道该怎么做。你能帮我查一下工厂代码吗。再次感谢。这些不是真正的代码。是我编的。但我希望这是有道理的。@Yacoub-我想避免的事情很少有1.避免将容器四处传递(甚至进入工厂)。2.在工厂内更新混凝土等级。3.使用Activator.CreateInstance-实际上是更新实例。我想,不知何故,神奇的是,团结可以实现好莱坞的原则(“不要打电话给我们,我们会打电话给你”)。我最终在工厂里使用了2号。如果你以答案的形式发布,我可以将你的建议标记为接受。再次感谢你。
consumer.TakeUserSpecificAction();
container.Reslove<IDependencyClass>("InstanceB") 
public class Consumer
{
    IDependencyClass dependencyInstance;
    public Consumer([Dependency("InstanceB")]IDependencyClass _dependencyInstance)
    {
        dependencyInstance = _dependencyInstance;
    }
}