【问题标题】:How do you inject a derived class as a service如何将派生类作为服务注入
【发布时间】:2021-03-24 07:45:11
【问题描述】:

我想将我的组件使用的服务接口与其实现分开(以简化功能强大的手工模拟的创建,它确实发生了),并将实现注入为使用它的组件的依赖项。这种方法在 Java Spring 后端很常见。

所以,如果我有这样的代码:

export abstract class AbstractMyService {// Defines the interface of the service
   ...
}

export class MyService extends AbstractMyService {// The concrete implementation
   ...
}

@Component({
    selector: 'app-myComponent',
    templateUrl: './my.component.html',
    styleUrls: ['./my.component.css']
})
export class MyComponent implements OnInit {

    constructor(
        private readonly service: AbstractMyService) {
    }

    ...
}

我如何确保当MyComponent 在应用程序中被实例化时,它有一个MyService 类型的对象传递给它的构造函数?

我知道如果我分离接口和实现(所以MyService 是一个具体的类,AbstractMyService 不存在),我可以简单地这样做:

@Injectable({
    providedIn: 'root'
})
export class MyService {
   ...
}

我是否只需将MyService 注释为@Injectable?还是我必须做一些更复杂的事情?

【问题讨论】:

    标签: angular dependency-injection derived-class


    【解决方案1】:

    您应该将实现声明为提供者明确

    @NgModule({ // or @Component, depending on the place you want to configure.
    ....
      providers: [{ 
        provide: AbstractMyService,
        useClass: MyService
      }]
    }) 
    

    没有办法像在 Spring 中那样“自动检测”。该配置明确表示,如果使用令牌AbstractMyService 注入项目,则MyService 类将用作构造函数。

    在您希望所有组件使用相同的具体类的常见情况下,您可以为您的AppModule 声明 provider。对于单元测试,您可以将提供程序声明为 TestBed 配置的一部分:

          TestBed.configureTestingModule({
             declarations: [MyComponent],
             providers: [
                ...
                { provide: AbstractMyService, useFactory: () => { return new MockMyService(...); } }]
            });
    

    【讨论】:

      猜你喜欢
      • 2015-10-20
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-30
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多