使用静态方法中的IoC Container解析类型

时间:2014-03-03 22:31:41

标签: c# java dependency-injection inversion-of-control static-methods

当使用没有静态容器实例的IoC容器时(因为这会导致服务定位器反模式),如何从静态方法解析类型?

说,我有一个从文件中读取对象Document的方法:

public class Document {
    // when used with IoC, the Logger gets injected via property injection
    public ILogger Logger { get; set; }
    /* ... */
    public static Document Read (string filePath)
    {
        // need to resolve an ILogger at this point?
        Logger.Info ("reading in {0}", filePath);

        /* ...read in document an return a document instance here ... */

    }
}

Code是C#,但同样的问题也适用于Java项目。

我知道一个简单的答案是“不要使用静态方法”,但鉴于该方法是无状态的,我认为这是静态方法有意义的情况之一。

拥有一个单独的IoC容器也会有所帮助,但众所周知这是一种反模式。

那么,解决问题的方法是什么?

1 个答案:

答案 0 :(得分:1)

虽然,我可以理解为什么将此函数编写为静态是有意义的,答案很简单,DI对于具有关联状态的静态方法并不顺利。注入属性是对象的状态,具有关联状态的静态方法被视为anti-pattern

DI有时会迫使你使用纯(非反)模式。

如果你坚持在你的情况下使用静态方法,我可以建议这些来涵盖你的选择。一切都不完美。

  1. 将注入的对象作为参数添加到函数中。 Document.Read(logger, filePath)。 如果您没有使用IoC框架,则替代方案是: new Document(logger).Read(filepath) 这或多或少是调用者的笨拙代码。
  2. 按照您的说法使用ServiceLocator。
  3. 向类添加静态初始化方法,并注入其所有依赖项(作为静态属性)。您必须在应用程序启动时调用此初始化。