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