当前位置: 首页 > 知识库问答 >
问题:

直接使用$injector实例与获取依赖项作为参数

翟昊明
2023-03-14

在 Angular 中,直接从$injector实例获取依赖项(而不是作为参数)是否被认为是一种很好的做法?

我有一个问题,我的控制器开始有很多依赖项,因此没有:

myApp.controller(['$scope', 'Dep1', 'Dep2', 'Dep3', function($scope, Dep1, Dep2, Dep3) {
    ...
}]);

我会做:

myApp.controller(['$scope', '$injector', function($scope, $injector) {
    var Dep1 = $injector.get('Dep1');
    var Dep2 = $injector.get('Dep2');
    var Dep3 = $injector.get('Dep3');
}]);

我发现它在功能上是一样的,但是参数上的混乱要少得多。我想这会让我的组件不太容易测试,对吧?

你怎么认为?

共有2个答案

景宏盛
2023-03-14

这取决于您如何编写代码以及如何轻松编写代码并使您灵活地编写代码。我总是以这种方式编写控制器,希望它会有所帮助:}

var appCtrl = function($scope, others){...}
app.controller('appCtrl',['$scope', 'others', appCtrl]);
白赞
2023-03-14

根据我的观点,在阅读以下帖子后:

职位1

帖子2

安格拉关于DI(依赖注入)的文档

为了最小化长依赖项列表,您的第二种方法被视为服务定位器反模式。请参阅-服务定位器反模式

使用服务定位器反模式是不好的,因为它会让你作为维护开发人员的生活变得更糟,因为你需要使用大量的脑力来理解你所做的每一个更改的含义。使用$injector混淆了资源的实际依赖关系(在本例中是控制器)并扼杀了可运维性。

此外,根据angular的文档,首选方法是:

使用内联数组注释(首选)

如果你的控制器最终使用了这么多的依赖关系,也许你做错了什么,也许你打破了单一责任原则。考虑:

    < li >将更多的逻辑委托给注入的服务 < li >分成不同的控制器,因此每个控制器只有(大约)1项职责
 类似资料:
  • 我的应用程序使用Play-2.4。2/Scala-2.11。6提供了对DI的内置GUI支持 我所有的DAO都将实现绑定到下面的接口,这应该是Guice中最简单的方法 上述实现不需要添加任何模块来提供绑定。 现在由于某种原因,我不想使用@Inject注释将依赖项注入到Books类的构造函数中。所以我试着注射如下 但这给我带来了一个guice配置异常,它说: 现在需要做什么?在这种情况下,我的方法是对

  • 我正试图让maven下载所有的依赖项(编译、测试、插件等)。)这样我就可以避免让我们的dockerized构建浪费不必要的时间一遍又一遍地下载它们。 我们已经对maven build进行了dockerized,这样我们就可以从jenkins运行它,而无需在jenkins机器上安装大量构建特定的依赖项(Java、redis、maven依赖项等)。我们的构建依赖于增量docker构建,它只执行实际需要

  • 本文向大家介绍AngularJS $injector 依赖注入详解,包括了AngularJS $injector 依赖注入详解的使用技巧和注意事项,需要的朋友参考一下 推断式注入 这种注入方式,需要在保证参数名称与服务名称相同。如果代码要经过压缩等操作,就会导致注入失败。 标记式注入 这种注入方式,需要设置一个依赖数组,数组内是依赖的服务名字,在函数参数中,可以随意设置参数名称,但是必须保证顺序的

  • 问题内容: 是否可以在pom.xml中将JavaFX 2.0引用为Maven中的依赖项,以便一切顺利进行? 我在这个问题中看到可以在本地安装jfxrt.jar,但是理想情况下,我希望使用一种更简单的方法,在该方法中可以正确解决依赖关系并下载它,而无需任何本地黑客。 问题答案: 不,目前还没有这样的解决方案。我怀疑它会永远存在,因为从Java 1.7更新2开始,JavaFX与JVM一起安装了。从Ja

  • 我想在Gradle拥有所有可用的依赖构件之后,在将来手动下载依赖构件,因此我想获得Gradle用来下载这些构件的URL。 有没有一种方法可以获得Gradle下载的依赖项的URL?