我可以使用IoC容器来创建需要运行时值的依赖项吗?

4

我是一个IoC新手,因此我想知道它是否是我想要完成的工作的正确工具。

我正在编写一个多租户应用程序,我们可能希望在几个地方根据当前登录用户所属的组织使用不同的接口实现。

例如,当来自一个组织的用户创建工作订单时,需要向该用户的主管发送电子邮件。但对于所有其他组织,不需要发送该电子邮件。这是典型的策略模式。

我的问题是,我是否可以通过某种方式指示IoC容器查看某个运行时值(在这种情况下是已登录用户的OrganizationId)以确定注入哪个IWorkOrderProcessor接口实现到需要它的对象的构造函数中?

我目前正在使用Windsor,但使用其他容器的示例也可以。

4个回答

3

谢谢,Mauricio!IHandlerSelector 功能正是我正在寻找的! - Brian Sullivan

1

大多数好的IOC容器都支持这种用法。

我不熟悉Windsor,我选择的IOC是StructureMap。在StructureMap流畅的接口中,您有很多选项可以设置运行时注入的对象参数,具体取决于您可以用代码表达的任何内容。我相信Windsor也提供了同样的功能。

我对像这样使用IOC唯一要说的是,有时它实际上会使解决方案更难理解。

在您的示例中,如果您真的有一个真正的用例,需要实现此行为,即使您没有使用IOC作为注入的策略对象(使用某些工厂方法),那么我会说,是的,请使用IOC实现。

但是,如果您实际上不需要注入整个对象抽象来表达是否向某些用户发送电子邮件的逻辑,那么这可能是为了模式而模式的情况。


0

这是 DI 中常见的一个挑战,答案总是创建并注入一个抽象工厂。在您的情况下,您可以定义一个如下的接口:

public interface IWorkerProcessorFactory
{
    IWorkerProcessor Create(int organizationId);
}

在所有需要组织ID并需要IWorkerProcessor实例的类中,您需要依赖于IWorkerProcessorFactory并调用其Create方法。
这种模式适用于“贫民版DI”或几乎任何您想使用的DI容器。
以下是一个更完整的示例:无法组合工厂/DI

0

我认为您可以这样做,因为IoC容器可以使用不同类型的注入:

  1. 构造函数注入
  2. 设置器注入
  3. 接口注入(方法注入)

构造函数注入提供了完全初始化的对象,但注入的类型和值必须在对象创建之前知道(例如可能从配置文件中加载)。

方法(或设置器)注入是灵活的 - 您可以延迟注入直到需要的类型或值。这种方法的缺点是在创建对象时您没有完全初始化的对象。

一切都取决于您的容器实现方式。

顺便说一下:类似的问题已经被问过:IoC:使用现有的运行时对象代替容器初始化组件的先决条件


注入的类型和值必须在应用程序启动时已知(例如从配置文件加载)。-> 不。 - Mauricio Scheffer
没错,我的意思是它们必须在对象创建之前被知道。我的错误。已修复。谢谢。 - Dawid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接