私はhttp://misko.hevery.com/attachments/Guide-Writing%20Testable%20Code.pdf (特にページ 8 を参照) を読んで、テスト可能なコードの記述に関する Misko の Youtube ビデオを見ていましたが、Angular DI はデメテルの法則を破るように強制しますか。
Demeter の法則を破る Java コンストラクターの例を PDF から単純化すると、次のようになります。
class AccountView {
boolean isAdmin;
AccountView(AccountService) {
isAdmin = AccountService.getCurrentUser().getProfile().isAdmin();
}
}
このクラスは、ユーザーが管理者であるかどうかのみを必要とし、AccountService は必要としないためです。
Angularは、DIでDemeterの法則を破るように強制しているようです。次の代替手段が見つかりません。
.controller('AccountServiceController',
['AccountService',
function(AccountService) {
this.user = AccountService.getCurrentUser().getProfile().isAdmin();
}]
);
これが解決パラメーターを持つルーターのコントローラーであるコントローラーである場合、ユーザーを注入できますが、一般的なケースではできません。何かご意見は?AccountService のみがシングルトンであり、後続の各オブジェクトはインスタンスである (DI できない) と想定していることに注意してください。