使用 TypeScript,我可以轻松地将类绑定到自身:
bootstrap(MyAppComponent, [MyClass]);
然而,我想将我的类绑定到一个接口,就像这样:
boostrap(MyAppComponent, [???]);
以便我能够像以下这样注入它:
class MyAppComponent {
constructor(my_class : IMyClass){
}
};
在Angular2中是否有可能做到这一点?如果是,我需要如何指定绑定?
使用 TypeScript,我可以轻松地将类绑定到自身:
bootstrap(MyAppComponent, [MyClass]);
然而,我想将我的类绑定到一个接口,就像这样:
boostrap(MyAppComponent, [???]);
以便我能够像以下这样注入它:
class MyAppComponent {
constructor(my_class : IMyClass){
}
};
在Angular2中是否有可能做到这一点?如果是,我需要如何指定绑定?
一些背景信息。在TypeScript中,接口是结构性的,并且在运行时不会保留。因此,您必须按如下方式使用ILoginService:
constructor(@Inject("ILoginService") s:ILoginService).
您不必使用字符串-任何对象都可以传递。我们实际上提供了一个称为OpaqueToken的对象,可用于此目的。
interface ILoginService { login(credentials);}
const ILoginService = new OpaqueToken("LoginService");
constructor(@Inject(ILoginService) s:ILoginService).
export class DatabaseService{
getService: ()=>string;
}
//hibernate.service.ts
import {DatabaseService} from "./abstract-parent-service";
export class HibernateService implements DatabaseService{
constructor() { }
getService() {
return "i am hibernate";
}
}
//jdbc.service.ts
import {DatabaseService} from "./abstract-parent-service";
export class JDBCService implements DatabaseService{
constructor() { }
getService() {
return "i am Jdbc";
}
}
//cmp-a.component.ts
import {DatabaseService} from "./abstract-parent-service";
import {HibernateService} from "./hibernate.service";
@Component({
selector: 'cmp-a',
template: `<h1>Hello Hibernate</h1>`,
providers: [{provide: DatabaseService, useClass: HibernateService}]
})
export class CmpAComponent {
constructor (private databaseService: DatabaseService) {
console.log("Database implementation in CompA :"+this.databaseService.getService());
}
}
//cmp-b.component.ts
import {DatabaseService} from "./abstract-parent-service";
import {HibernateService} from "./hibernate.service";
@Component({
selector: 'cmp-b',
template: `<h1>Hello Jdbc</h1>`,
providers: [{provide: DatabaseService, useClass: JDBCService}]
})
export class CmpAComponent {
constructor (private databaseService: DatabaseService) {
console.log("Database implementation in CompA :"+this.databaseService.getService());
}
}
class A{
constructor(){
console.log("in A");
}
}
class B extends A{
constructor(){
super();
console.log("in B");
}
}
class C extends A{
constructor(){
super();
console.log("in C");
}
}
let c = new C();
//This thing is not possible in typescript
class D extends B, C{//error: Classes can only extend a single class
constructor(){
super();// which constructor B or C
console.log("in D");
}
}
如果您将此模式用于DI,请确保您的子类服务不会在未来扩展任何其他功能。
new OpaqueToken("LoginService")
传递的是LoginService
而不是ILoginService
? - Danny Bullis