首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >注入带有角4的接口

注入带有角4的接口
EN

Stack Overflow用户
提问于 2017-07-15 11:58:25
回答 2查看 6.2K关注 0票数 3

我正在尝试创建一个通用的DeleteableConfirmationComponent,它将允许我显示一个确认对话框,并从实现Deleteable接口的任何注入服务中调用delete方法。

为此,我创建了以下接口:

代码语言:javascript
复制
export interface Deleteable {
  delete(object);
}

我有一个实现它的服务:

代码语言:javascript
复制
@Injectable()
export class LocalityService implements Deleteable {
  delete(locality): Observable<Locality> {
    // Delete logic.
  }
}

对于DeleteableConfirmationComponent,我尝试使用构造函数注入服务:

代码语言:javascript
复制
export class DeleteableConfirmationComponent {
  constructor(
    public dialog: MdDialogRef<DeleteableConfirmationComponent>,
    @Inject(MD_DIALOG_DATA) public data: any,
    private service: Deleteable
  ) {}

  delete() {
    this.service.delete(this.object)
                .subscribe(() => {
                  this.dialog.close();
                });
  }
}

但不幸的是,我有一个错误,说DeleteableConfirmationComponent.不能解决的所有参数

现在,我正在使用对话框数据选项,以传递我的服务:

代码语言:javascript
复制
confirmDelete(locality) {
  this.dialog.open(DeleteableConfirmationComponent, {
    data: {
      service: this.localityService
    }
  });
}

但是它感觉很脏,允许注入任何类型的服务,而我希望强制实现Deleteable接口的服务。

我在想,我可能更喜欢使用abstract class,但我更喜欢写作而不是继承。

有什么想法或最佳实践建议吗?

EN

回答 2

Stack Overflow用户

发布于 2017-07-15 20:33:57

正如注释中提到的,您可以将接口转换为抽象类:

代码语言:javascript
复制
export abstract class Deleteable {
  abstract delete(object);
}

然后,在提供程序中,您可以将其映射到真正的类:

代码语言:javascript
复制
providers: [{ provide: Deleteable, useValue: new LocalityService() }]

您可能不喜欢这种方法,因为现在看来LocalityService必须扩展Deleteable。但是如果LocalityService需要扩展其他类呢?不允许多重继承:

代码语言:javascript
复制
// Error: Classes can only extend a single class
export class LocalityService extends OtherClass, Deleteable { }

或者您可能根本不喜欢Deleteable现在将出现在LocalityService的原型链中这个事实

代码语言:javascript
复制
export class LocalityService extends Deleteable {
  delete(locality): void {
    // Returns true
    alert(this instanceof Deleteable);
  }
}

但是,如this answer所示,TypeScript允许您将类视为接口。因此,您可以在抽象类中使用implements

代码语言:javascript
复制
export class LocalityService extends OtherClass implements Deleteable {
  delete(locality): void {
    // Returns false
    alert(this instanceof Deleteable);
  }
}

因此,对于所有的意图和目的,您的抽象类现在的行为就像一个接口。它甚至不会出现在原型链中。

票数 3
EN

Stack Overflow用户

发布于 2018-08-22 09:23:06

可以使用InjectionToken替换不推荐的OpaqueToken

代码语言:javascript
复制
export const AuthenticationProvider = new InjectionToken(
  "AuthenticationProvider",
  { providedIn: "root", factory: () => new CognitoAuthenticationProvider() }
);

...

@Injectable()
export class CognitoAuthenticationProvider implements IAuthenticationProvider {

...

@Injectable({
  providedIn: "root"
})
export class AuthenticationService {
  constructor(
    @Inject(AuthenticationProvider)
    private authenticationProvider: IAuthenticationProvider,
    private http: HttpClient
  ) {}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45117934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档