简单注射器条件注射

本文关键字:条件 注射器 简单 | 更新日期: 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;
    }
});