在这种情况下需要帮助理解依赖性倒置原则。

时间:2018-04-08 12:40:31

标签: c# dependency-injection dependencies inversion-of-control

刚开始工作,有人提到这个概念,我仍然不明白。我最初认为这意味着视图应该使用IN BETWEEN类的业务逻辑类。因此,即使后面的代码失败,类之间也会始终返回默认值。

他们告诉我这是错误的并且说它更多地与使用HTMLAGILITYPACK这样的语句有关。你应该如何做到这一点,以便业务逻辑不依赖于像HTMLAGILITYPACK那样对程序至关重要的东西?这是否意味着我应该导入可以搜索html并编写"的另一个.dll;以防htmlagilitypack以某种方式失败"请改用.dll吗?

我不明白。谢谢!

(程序目的)该程序进入一个网站并使用htmlagilitypack下载一些元素,然后使用从网站获得的信息填写类。

2 个答案:

答案 0 :(得分:1)

你的理解是错误的。网络上有数十个教程,只有通过在StackOverFlow上询问才能理解它。你应该阅读软件设计模式和架构书籍。在这里,我提到了依赖性倒置原则的最重要方面,但我鼓励您阅读以下链接并了解。

  

1-高级模块不应该依赖于低级模块

     

2-抽象不应该依赖于细节,细节应该依赖   抽象。

进一步阅读和实现技术只需阅读这些教程。它们很好,几乎适合初学者。

Dependency Inversion Principle(随C#示例提供)

Inversion of Control – An Introduction with Examples in .NET

第二个环节当然涵盖了更全面的概念。

答案 1 :(得分:1)

Dependency Inversion允许您编写不依赖于 外部 依赖关系的代码。
对于你的问题"这是否意味着我应该导入可以搜索html" 错误的另一个.dll,如果使用正确的依赖应该允许你引入另一个DLL而不做任何更改你的业务逻辑代码。

请考虑以下方法:

以下代码依赖于HTML Agility Pack。 HtmlWeb,web.Load和web.load返回的都是依赖项。

public string GetDocumentInfo(string path)
{
    var web = new HtmlWeb();
    var doc = web.Load(path);
    // ... etc ... etc
}

现在考虑修改:

以下代码仅取决于IDocumentReader 接口(您可以定义的接口)。

public string GetDocumentInfo(string path, IDocumentReader reader)
{
    return reader.Read(path);
} 

您希望这样做的原因是,以后您可以创建另一个实现IDocumentReader的类,该类读取XML,或读取.CSV文件等等。现在您的代码只需要一个实现IDocumentReader接口的类,并不关心在实现它的类中使用的框架。