简单注射器条件注射 [英] Simple Injector conditional injection

查看:93
本文介绍了简单注射器条件注射的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有两个控制器:ControllerA和ControllerB。这两个控制器都接受IFooInterface作为参数。现在,我有2个IFooInterface,FooA和FooB的实现。我想在ControllerA中注入FooA,在ControllerB中注入FooB。这在Ninject中很容易实现,但是由于性能更好,我将转向Simple Injector。那么如何在Simple Injector中做到这一点呢?请注意,ControllerA和ControllerB驻留在不同的程序集中,并且是动态加载的。

Lets say I have two Controllers: ControllerA and ControllerB. Both of those controllers accept as parameter IFooInterface. Now I have 2 implementation of IFooInterface, FooA and FooB. I want to inject FooA in ControllerA and FooB in ControllerB. This was easily achieved in Ninject, but I'm moving to Simple Injector due to better performance. So how can I do this in Simple Injector? Please note that ControllerA and ControllerB resides in different assemblies and are loaded dynamically.

谢谢

推荐答案

SimpleInjector文档将其称为基于上下文的注入。从版本3开始,您将使用 RegisterConditional 。从2.8版开始,此功能尚未在SimpleInjector中实现,但是文档包含有效的代码实现此功能的示例作为 Container 类的扩展。

The SimpleInjector documentation calls this context-based injection. As of version 3, you would use RegisterConditional. As of version 2.8, this feature isn't implemented in SimpleInjector, however the documentation contains a working code sample implementing this feature as extensions to the Container class.

使用这些扩展方法像这样的东西:

Using those extensions methods you would do something like this:

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;
    }
});

这篇关于简单注射器条件注射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆