在 angularjs 中使用 $injector 还是直接 DI?
Using $injector vs. direct DI in angularjs?
我没有看到直接注入我的依赖项与在 angularjs 中使用 $injector 的区别(或 pros/cons)。我为什么要做其中之一?这是两者的示例。
angular
.module("myApp")
.factory("myService", [
"$injector", function($injector) {
var $http = $injector.get("$http");
//used $injector to get $http, now get some data, etc.
}
]);
angular
.module("myApp")
.factory("myService", [
"$http", function($http) {
//just use $http to get some data, etc.
}
]);
两种解决方案都有效,但区别在于代码的可读性和可扩展性。
使用第二种解决方案,您可以看到所有模块的出厂定义依赖项。
angular
.module("myApp")
.factory("myService", [
"$myService", function($myService) {
}
]);
如果您注入整个 $injector,您的依赖项将得到修复。您将无法注入具有一致 API 的其他服务。
angular
.module("myApp")
.factory("myService", [
"$injector", function($injector) {
var $myService = $injector.get("myService");
}
]);
综上所述,两种解决方案都有效,但请使用第一种可能性。
这也使得单元测试更容易使用第一个示例。您只需模拟注入,您的依赖项就会为您处理。对于第二个例子,有很多方法可以解决它,但你只会让你的生活变得更加困难。
在大多数情况下,第二种方法简单、可读且有效,尤其是当您使用预编译器为您编写字符串值时,例如ng-annotate:
angular.module("myApp")
.factory("myService", /*@ngInject*/ function($http, $locale, $window) {
});
我看不出你应该避免它的理由。
第一种方法,使用 $injector
应保留用于特定情况,例如当注入太多时(并且您现在不想重构)或在测试中的某些特定情况下。
我没有看到直接注入我的依赖项与在 angularjs 中使用 $injector 的区别(或 pros/cons)。我为什么要做其中之一?这是两者的示例。
angular
.module("myApp")
.factory("myService", [
"$injector", function($injector) {
var $http = $injector.get("$http");
//used $injector to get $http, now get some data, etc.
}
]);
angular
.module("myApp")
.factory("myService", [
"$http", function($http) {
//just use $http to get some data, etc.
}
]);
两种解决方案都有效,但区别在于代码的可读性和可扩展性。
使用第二种解决方案,您可以看到所有模块的出厂定义依赖项。
angular
.module("myApp")
.factory("myService", [
"$myService", function($myService) {
}
]);
如果您注入整个 $injector,您的依赖项将得到修复。您将无法注入具有一致 API 的其他服务。
angular
.module("myApp")
.factory("myService", [
"$injector", function($injector) {
var $myService = $injector.get("myService");
}
]);
综上所述,两种解决方案都有效,但请使用第一种可能性。
这也使得单元测试更容易使用第一个示例。您只需模拟注入,您的依赖项就会为您处理。对于第二个例子,有很多方法可以解决它,但你只会让你的生活变得更加困难。
在大多数情况下,第二种方法简单、可读且有效,尤其是当您使用预编译器为您编写字符串值时,例如ng-annotate:
angular.module("myApp")
.factory("myService", /*@ngInject*/ function($http, $locale, $window) {
});
我看不出你应该避免它的理由。
第一种方法,使用 $injector
应保留用于特定情况,例如当注入太多时(并且您现在不想重构)或在测试中的某些特定情况下。