Javascript 角度扩展服务、继承和di,如何使构造函数匹配?
我试图对我拥有的一些服务进行某种继承。 我真的不知道这是不是一个好的做法,无论如何,我真的想重构所有的应用程序得到新的方法 不管怎样,这就是我所拥有的Javascript 角度扩展服务、继承和di,如何使构造函数匹配?,javascript,angular,typescript,dependency-injection,angular5,Javascript,Angular,Typescript,Dependency Injection,Angular5,我试图对我拥有的一些服务进行某种继承。 我真的不知道这是不是一个好的做法,无论如何,我真的想重构所有的应用程序得到新的方法 不管怎样,这就是我所拥有的 ............................... @Injectable() export class ApiBaseService { ............................... constructor(url : string, _logger : LoggerService) {
...............................
@Injectable()
export class ApiBaseService {
...............................
constructor(url : string, _logger : LoggerService) {
...............................
}
...............................
还有一个儿童班
...............................
@Injectable()
export class ApiWhatEverService extends ApiBaseService {
constructor(private _http: Http) {
super(environment.apiUrl);
}
...............................
}
这里的要点是,由于与LoggerService相关的DI,构造函数不匹配
所以我在这里的想法是尝试以任何其他方式注入LoggerService,就像使用angular的注入器一样,但它失败了
...............................
@Injectable()
export class ApiBaseService {
apiUrl;
_logger : LoggerService;
...............................
constructor(url : string) {
...............................
let injector = ReflectiveInjector.resolveAndCreate([
LoggerService
]);
this._logger = injector.get(LoggerService);
//IT DOESN'T GET ALL THE METHOD ASSOCIATED TO LoggerService
...............................
}
...............................
}
如果有人能帮助或指导我,我将不胜感激
非常感谢您提前框架实例化了提供者。用户不能向提供程序类构造函数提供参数
url:string
在可注入类中没有意义,它将导致DI错误,因为没有string
提供程序
有几种方法允许为提供者提供配置(请参阅)。可以在配置提供程序中提供URL:
const CONFIG = new InjectionToken<any>('config');
function configFactory() {
return {
url: environment.url
}
}
...
providers: [..., { provide: CONFIG, useFactory: configFactory }]
...
ReflectiveInjector
通常用于边缘情况(它被弃用,取而代之的是具有附加限制的StaticInjector
)。这里是反模式的。应尽可能使用现有的喷油器
@Injectable()
export class ApiBaseService {
constructor(
@Inject(CONFIG) protected config: any,
protected _logger : LoggerService
) {...}
}
@Injectable()
export class ApiWhatEverService extends ApiBaseService {
constructor(
@Inject(CONFIG) config: any,
_logger : LoggerService,
private _http: Http
) {
super(config, _logger);
}
}