【问题标题】:Does programming to an interface allow you to not recompile your code?对接口进行编程是否允许您不重新编译代码?
【发布时间】:2021-06-26 13:22:40
【问题描述】:

只是一个一般性问题,对接口进行编程是否允许您的代码不重新编译。我们只需要部署更改,不需要重新编译整个应用程序,对吧?

如果我们需要重新编译整个应用程序,接口如何帮助您系统中的模块松散耦合?

【问题讨论】:

  • 你如何编译你的应用程序?是否所有您的代码都编译为单个 exe 或 dll?
  • 欢迎来到 Stack Overflow。这是一个针对编码中的问题点提出具体问题的网站。如果您已经searched 站点,compose a question 和 enough explanation and code 以便尝试帮助您的人可以看到您的尝试、理解并重现您的错误。
  • 编译器已经为你做了。如果您要查看文件是否已被修改,则对文件应用校验和并将其与之前的校验和进行比较。但是只有校验和你不知道程序是否具有与以前版本相同的指令(代码)。你需要一个解析器来发现这些变化。

标签: c# oop interface


【解决方案1】:

不是自动的,但如果您正确地构建项目,它可能会。

考虑以下类型,每个类型都在自己的项目中,以及以下依赖项

  • MyApplication 依赖于一切
  • IMyInterface 不依赖任何东西
  • MyClass 依赖于 IMyInterface
  • MyImplementation 依赖于 IMyInterface(并实现 IMyInterface)

现在 MyApplication 可以创建一个 MyImplementation 对象并将其提供给 MyClass。但是,由于 MyClass 不直接依赖于 MyImplementation,因此如果 MyImplementation 发生更改,则不需要重新编译。仅当 IMyInterface 更改时。至少如果您使用增量编译。更实际地,您可能会拥有一个 IOC 容器来为您完成所有对象构造。

您可以将项目的依赖关系图视为有向循环图。如果项目中的任何内容更改了依赖它的所有内容,则需要直接或间接进行更改。如果您可以减少对最频繁更改的代码的依赖,则可以优化构建时间。但您也应该考虑到,c# 的编译速度总体上相当快,而且编译时间受许多其他因素的影响。

这假定项目是同一解决方案的一部分,对于程序集引用或动态加载的 dll,其他规则适用。

【讨论】:

  • 我的想法是尽量减少整个项目更改的影响,以防止重新编译。现在我明白它是基于我项目的依赖关系图的。对于 IOC 容器,我可以尝试使用注入的生命周期。
【解决方案2】:

不,当对 exe、dll 甚至外部 dll 进行更改时,必须重新编译 dll。

如果我们谈论的是使用外部 dll 的主 exe,那么只需重新编译 DLL,但它仍然需要替换原来 链接 的现有 dll exe。 (想想插入插件类型 dll)


几年前,我有一个 C#/.Net VSTO 智能文档,它可以从公司内部网上的一个共享受信任位置加载 Dll。用户只需安装一次智能文档。

然后,当我要更改业务逻辑时,我会替换共享中的新 dll,并告诉用户重新启动将加载外部 dll 的智能文档。

【讨论】:

  • 从设计原则的角度来看,使用接口允许模块或系统之间失去耦合。当所有模块都必须重新编译时,它是如何松散耦合的?
  • 再次以插件dll中的drop为例。如果该插件中的接口所附的 solid 实例被更改,则必须将 dll 编译为 IL 代码,以便 exe 可以在运行时读取它;但exe没有改变。您是否将重用与松散耦合混淆了。松耦合与 dll 和 exe 如何协同工作没有任何关系。如果你有一个 exe 实例化了一个实体实例,该实体实例附着在一个接口上,并且一个人改变了接口,这会影响 exe 中的实体实例,并且整个东西必须重新编译,因为它位于一个 exe 中。
  • 查看松耦合的工厂模式...通过让工厂返回一个版本化的接口 instance,使其与获得该实例的客户。因此客户端不必实例化实例;因此它不知道它并且是解耦的。
猜你喜欢
  • 1970-01-01
  • 2011-03-04
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多