Внедрение зависимостей для TypeScript
Теги: TS DI TypeScript Dependency-Injection
При изучении Angular2 столкнулся с внедрением зависимостей, и обнаружил, что это очень полезная вещь. Поэтому я попытался реализовать его самостоятельно.
На данный момент существует несколько API:
@Injectable()
class A {
}
@Injectable()
class B {
private val = '1234';
constructor(private a: A) {
}
getVal() {
return this.val;
}
setVal(newval) {
this.val = newval;
}
}
// Использование Injector.get(), можно получить экземпляр без предоставления параметров
let b = Injector.get(B);
let b2 = Injector.get(B);
// Тестирование: один и тот же класс может быть инстанцирован несколько раз, каждый экземпляр является отдельным объектом.
let newVal = 'zzzz';
b.setVal(newVal);
assert.equal(b.getVal(), newVal);
assert.equal(b2.getVal(), '1234');
####@Inject() И @Injectable(), используется для украшения свойств.
@Injectable()
class A {
@Inject()
b: ClassB;
}
####@Singleton
@Singleton()
class SingletonClass {
private val = '1234';
constructor(private a: A) {
}
get() {
return this.val;
}
set(newval) {
this.val = newval;
}
}
let b = Injector.get(SingletonClass);
let b2 = Injector.get(SingletonClass);
// Тестирование: класс, украшенный @Singleton(), все дескрипторы должны указывать на один и тот же объект
let newVal = 'zzzz';
b.set(newVal);
assert.equal(b.get(), newVal);
assert.equal(b2.get(), newVal);
####@Inject(()=>Type) @Injectable() не может обрабатывать A->B->A такие циклические зависимости. Когда A и B являются одиночными, их взаимная зависимость очень распространена. И @Inject(()=>Type) был создан для решения этой проблемы. Используя @Inject(()=>Type), пока в цикле существует один синглтон, все экземпляры в цикле могут быть правильно созданы.
// singleton_class.ts
import {ClassA} from "./class_a"
@Singleton()
class SingletonClass{
}
// class_a.ts
import {SingletonClass} from "./singleton_class"
@Injectable()
class ClassA {
@Inject(()=>SingletonClass)
s: SingletonClass;
}
Что касается того, почему необходимо добавить функцию, возвращающую тип, в качестве параметра для решения проблемы циклической зависимости, это потому, что TypeScript при включении двух файлов друг в друга обязательно будет иметь неопределенный тип по крайней мере для одного класса. Добавление параметра фактически является вынужденным решением.
npm install npm test
Декоратор не требует добавления скобок. Вот так:
@Injectable
class A{}
Добавление скобок принудительно сделано для соответствия декораторам Angular2; также для обеспечения лучшей расширяемости. Например, @Inject() может принимать параметр, решая проблему циклических зависимостей.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )