当使用没有静态容器实例的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容器也会有所帮助,但众所周知这是一种反模式。
那么,解决问题的方法是什么?
答案 0 :(得分:1)
虽然,我可以理解为什么将此函数编写为静态是有意义的,答案很简单,DI对于具有关联状态的静态方法并不顺利。注入属性是对象的状态,具有关联状态的静态方法被视为anti-pattern。
DI有时会迫使你使用纯(非反)模式。
如果你坚持在你的情况下使用静态方法,我可以建议这些来涵盖你的选择。一切都不完美。
Document.Read(logger, filePath)
。
如果您没有使用IoC框架,则替代方案是:
new Document(logger).Read(filepath)
这或多或少是调用者的笨拙代码。