Dependency injection 依赖注入框架值得额外的间接层吗?

Dependency injection 依赖注入框架值得额外的间接层吗?,dependency-injection,Dependency Injection,您是否发现依赖注入框架使代码更难遵循?间接性是否超过了好处?是的,您的代码变得更加解耦,更易于测试。当您有很多测试并且每个测试都需要一个沉重的对象(如数据库层)时,这尤其方便 如果您使用依赖项注入,您可以简单地创建所谓的“mock”对象或存根,并使用它们让您的测试运行得更快,副作用更少(数据库状态) 确实,通过查看代码,您无法直接看到使用了哪个实现。您将看到对接口的引用。一个好的IDE可能具有查看特定接口的所有实现的功能,因此请利用它来发挥您的优势。我认为其好处取决于您如何使用它 例如,在我当前

您是否发现依赖注入框架使代码更难遵循?间接性是否超过了好处?

是的,您的代码变得更加解耦,更易于测试。当您有很多测试并且每个测试都需要一个沉重的对象(如数据库层)时,这尤其方便

如果您使用依赖项注入,您可以简单地创建所谓的“mock”对象或存根,并使用它们让您的测试运行得更快,副作用更少(数据库状态)


确实,通过查看代码,您无法直接看到使用了哪个实现。您将看到对接口的引用。一个好的IDE可能具有查看特定接口的所有实现的功能,因此请利用它来发挥您的优势。

我认为其好处取决于您如何使用它


例如,在我当前的项目中,我们使用dep inj根据应用程序配置注入不同的项,特别是单元测试。一个很好的例子是让生产系统使用真正的“登录”实现,但让单元测试使用模拟的“登录”,该“登录”对于已知的登录总是返回true/valid,但不会返回其他值。

在我看来,依赖注入框架并不会使代码读起来更复杂。事实上,您只看到对接口的引用,而不看到对具体实现的引用,这是很好的,因为您不必关心具体实现是如何工作的

如果在源代码中导航太困难,请使用Resharper,一切都会好起来。

对于非平凡的“enterprisey”应用程序,是的,这是值得的。在DI框架出现之前,每个商店都在其他项目使用的一些内部库中实现了自己独特的“ServiceLocator”类。所以在整个代码库中都有对那东西的调用

这些调用表示对象需要发现/配置它们自己的依赖项。DI框架消除了所有这些代码,因此您的对象变得更简单,因此更易于测试

现在,如果对象的依赖关系没有太多变化,那么间接(集中式配置)的价值对您来说就更少了


有关将DI与ServiceLocator进行对比的更多详细信息,请参见Fowler的

依赖注入是一个非常好的想法;尽管成功的很大一部分在于,您可以纯粹为接口编写代码。它迫使(或鼓励)您将程序中的关注点分离为多个协作服务类型实例,这些实例不知道彼此是如何实现的。这使得在类之间引入不需要的和不必要的依赖关系的可能性大大降低


然而,控制反转并不是唯一的方法。一位同事通过编写自己的
JNDI
实现实现了这一点。我花了相当长的时间才说服了我,但它太棒了,而且只有典型项目的一小部分配置。

我发现自定义静态哈希表工厂可以很好地解耦依赖项,满足我的需求。我曾经尝试过几次使用一个完整的IOC容器,每次我都被我的团队其他成员不得不忍受的学习曲线(以及所有配置)吓了一跳。。。所有这些都是为了在我的香草车上增加一些功能

因此,我想依赖注入的更大问题不在于模式本身,而在于它目前在开发人员社区中产生的时尚。它听起来很酷,所以使用它是有压力的,即使工程不是由相应的需求驱动的

我们倾向于拿一把大枪对着蚊子,因为枪看起来很酷


起初我喜欢依赖注入框架的想法,但除了支持单元测试之外,我仍然不相信使用依赖注入框架的好处。这意味着,对于接管我的项目的人来说,还有一个框架/API/技术需要学习,在某些情况下可能会更加冗长。你可以在这两篇相互竞争的博客文章中找到一个很好的正反两面


归根结底,它是真的减少了耦合,增加了内聚力,还是仅仅把问题推到了表面之下。现在在我的项目中,我不认为有太多需要它,即使是支持单元测试。不过,如果你打算为C#挑一个,我强烈推荐Ninject。它是轻量级的,简单的和完全流畅的配置。。。没有XML!Sweeet:)

您可以将类设计为注入依赖项(通过构造函数或属性),而无需使用依赖项注入框架。只需自己实例化依赖项,并将其传入或从服务定位器或注册中心类中获取它。但是,与其让类本身通过调用服务定位器来解决其依赖关系,不如让实例化该类的类解决其依赖关系。您可以维护一个可测试的类设计,而不需要另一个库和框架的开销和复杂性

就我个人而言,我知道每当我尝试使用DI框架时,基本上就是我最终使用它的目的。我也看到过这样的情况:人们将他们的DI容器包装在一个静态的IoC类中,以构建层次结构中的对象,而在我看来,这有点违背了目的;在这一点上,它不是又回到了服务定位器的位置吗?我想我在实际使用中并没有什么不同。我说的是恶作剧,你是在用反思和创业大热来做同样的事情

您无法消除依赖项,但您确实可以在XML配置文件中混淆这些依赖项。在某个时刻,某些东西将调用
new
。您真的要在不重新编译或重新测试应用程序的情况下交换接口的实现吗?如果没有,请保持原样