![创建单例访问统一容器或将其传递给应用程序更好吗?[关闭],第1张 创建单例访问统一容器或将其传递给应用程序更好吗?[关闭],第1张](/aiimages/%E5%88%9B%E5%BB%BA%E5%8D%95%E4%BE%8B%E8%AE%BF%E9%97%AE%E7%BB%9F%E4%B8%80%E5%AE%B9%E5%99%A8%E6%88%96%E5%B0%86%E5%85%B6%E4%BC%A0%E9%80%92%E7%BB%99%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%9B%B4%E5%A5%BD%E5%90%97%EF%BC%9F%5B%E5%85%B3%E9%97%AD%5D.png)
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反模式的两个变体,所以我不建议这样做。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)