简单注射器条件注射
本文关键字:条件 注射器 简单 | 更新日期: 2023-09-27 18:35:55
假设我有两个控制器:控制器A和控制器B。这两个控制器都接受参数 IFooInterface。现在我有 2 个 IFooInterface、FooA 和 FooB 的实现。我想在控制器 A 中注入 FooA,在控制器 B 中注入 FooB。这在 Ninject 中很容易实现,但由于性能更好,我正在转向 Simple Injector。那么如何在简单注射器中做到这一点呢?请注意,控制器 A 和控制器 B 驻留在不同的程序集中,并且是动态加载的。
谢谢
自版本 3 开始,简单注入器具有 RegisterConditional 方法
container.RegisterConditional<IFooInterface, FooA>(c => c.Consumer.ImplementationType == typeof(ControllerA));
container.RegisterConditional<IFooInterface, FooB>(c => c.Consumer.ImplementationType == typeof(ControllerB));
container.RegisterConditional<IFooInterface, DefaultFoo>(c => !c.Handled);
SimpleInjector 文档调用此基于上下文的注入。从版本 3 开始,您将使用 RegisterConditional
.从版本 2.8 开始,此功能未在 SimpleInjector 中实现,但文档包含一个工作代码示例,将此功能实现为 Container
类的扩展。
使用这些扩展方法,您将执行以下操作:
Type fooAType = Assembly.LoadFrom(@"path'to'fooA.dll").GetType("FooA");
Type fooBType = Assembly.LoadFrom(@"path'to'fooB.dll").GetType("FooB");
container.RegisterWithContext<IFooInterface>(context => {
if (context.ImplementationType.Name == "ControllerA")
{
return container.GetInstance(fooAType);
}
else if (context.ImplementationType.Name == "ControllerB")
{
return container.GetInstance(fooBType)
}
else
{
return null;
}
});