DI的正确方法是使用 构造函数注入 或其他DI模式(但最常见的是Constructor Injection)将依赖项注入到使用者中, 而与DI
Container无关 。
在您的示例中,看起来您需要依赖项
TestSuite和
TestCase,因此您的TestSuiteParser类应通过(仅)构造函数要求它们来
静态声明 它需要这些依赖项:
public class TestSuiteParser{ private readonly TestSuite testSuite; private readonly TestCase testCase; public TestSuiteParser(TestSuite testSuite, TestCase testCase) { if(testSuite == null) { throw new ArgumentNullException(testSuite); } if(testCase == null) { throw new ArgumentNullException(testCase); } this.testSuite = testSuite; this.testCase = testCase; } // ...}通知如何组合
readonly关键字和保护条款保护类的不变量,确保依赖 将 提供给TestSuiteParser的任何成功创建实例。
您现在可以像这样实现Parse方法:
public TestSuite Parse(XPathNavigator someXml) { List<XPathNavigator> aListOfNodes = DoSomeThingToGetNodes(someXml) foreach (XPathNavigator blah in aListOfNodes) { this.testSuite.TestCase.Add(this.testCase); } }(但是,我怀疑可能涉及多个TestCase,在这种情况下,您可能想注入一个Abstract
Factory而不是一个TestCase。)
在您的Composition Root中,您可以配置Unity(或任何其他容器):
container.RegisterType<TestSuite, ConcreteTestSuite>();container.RegisterType<TestCase, ConcreteTestCase>();container.RegisterType<TestSuiteParser>();var parser = container.Resolve<TestSuiteParser>();
当容器解析TestSuiteParser时,它将理解构造函数注入模式,因此它将 自动 连接实例及其所有必需的依赖项。
创建Singleton容器或将容器四处传递只是Service
Locator反模式的两个变体,所以我不建议这样做。


![创建单例访问统一容器或将其传递给应用程序更好吗?[关闭] 创建单例访问统一容器或将其传递给应用程序更好吗?[关闭]](http://www.mshxw.com/aiimages/31/576220.png)
