c# - 重构大型项目的 DI

标签 c# dependency-injection refactoring dependencies code-injection

我从事一个大型平台项目,支持大约 10 种使用我们代码的产品。

到目前为止,所有产品都使用了我们平台的全部功能:
- 从数据库中检索配置数据
- 远程文件系统访问
- 安全授权
- 基本逻辑(我们付费提供的东西)

对于新产品,我们被要求在没有平台带来的基础架构的情况下支持较小的功能子集。我们的架构很旧(从 2005 年左右开始编码)但相当可靠。

我们有信心可以在现有类(class)中使用 DI 来做到这一点,但估计需要 5 到 70 周的时间,具体取决于您与谁交谈。

有很多文章告诉您如何进行 DI,但我找不到任何文章告诉您如何以最有效的方式重构 DI?是否有工具可以执行此操作,而不必通过 30.000 行代码并多次按下 CTRL+R 来提取接口(interface)并将它们添加到构造函数中? (如果有帮助,我们有 resharper)如果没有,您认为快速实现这一目标的理想工作流程是什么?

最佳答案

我假设您希望使用 StructureMap、Funq、Ninject 等 IoC 工具。

在这种情况下,重构工作真正开始于更新代码库中的入口点(或 Composition Roots)。这可能会产生很大的影响,特别是如果您广泛使用静态并管理对象的生命周期(例如缓存、延迟加载)。一旦您准备好 IoC 工具并将其连接到对象图,您就可以开始扩展 DI 的使用并享受其中的好处。

我会首先关注类似设置的依赖项(应该是简单的值对象),然后开始使用您的 IoC 工具进行解析调用。接下来,创建工厂类并注入(inject)这些类来管理对象的生命周期。感觉就像你在倒退(而且很慢),直到你到达你的大多数对象都在使用 DI 和必然的 SRP 的顶峰 - 从那里它应该是下坡路。一旦您实现了更好的关注点分离,您的代码库的灵 active 和您进行更改的速度就会显着提高。

警告:不要让自己被愚弄,以为到处撒上“服务定位器”就是你的 Elixir ,它实际上是一个 DI antipattern .我认为您首先需要使用它,但随后您应该使用构造函数或 setter 注入(inject)完成 DI 工作并删除服务定位器。

关于c# - 重构大型项目的 DI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14283731/

相关文章:

java - 如何扩展Eclipse的重命名重构完成后触发另一个重构

java - 需要帮助重构这个方法

c# - 用非常相似的方法重构两个类的最佳方法?

c# - 在 C# 中插入问题,使用 sqlcommand

c# - 未找到适合完成此操作的成像组件

C# MVC,从 web.config 读取回车符

c# - WCF .svclog 文件的 Web API 2 等价物

c# - Simple Injector 是否有办法结合 TypeFactoryContext 向实例工厂注册?

c# - 在单元测试中使用 DI 容器

c# - 让 autofac 与 mvc6 beta5 一起工作