[Angular 2] Value Providers & @Inject
Dependecies aren’t always objects created by classes or factory functions. Sometimes, all we really want is inject a simple value, which can be a primitive, or maybe just a configuration object. For these cases, we can use value providers and in this lesson we’ll discuss, how they are created.
For example we have this code:
import {LoggerProvider} from './LoggerProvider';
import (Http) from '@angular/http'; import {Injectable} from '@angular/core'; @Injectable export class TodoService{ apiUrl : string = "http://localhost:3000/api" constructor(private logger: LoggerProvider, private http: Http){ } getTodos(){ this.logger.debug('Items', this.todos); return this.http.get(`${this.apiUrl}/todos`).map(res => res.json()); } }
Code use hard coded 'apiUrl' to get data from backend. It would be better to inject apiUrl instead of hard coded.
app.ts:
providers: [ TodoService, ConsoleService, TranslateService, ,{ provide: LoggerProvider, useFactory: (cs, ts) => { return new LoggerProvider(cs, ts, true) }, deps: [ConsoleService, TranslateService] } ,{ provide: apiUrl, useValue: 'http://localhost:3000/api' } ],
Inside providers we add another value provider. Using keyword 'useValue'.
Then in the TodoService, we can do:
import {LoggerProvider} from './LoggerProvider'; import {Injectable} from '@angular/core';
import {Http} from '@angular/core'; import {Inject} from '@angular/core'; @Injectable export class TodoService{ constructor(@Inject(apiUrl) private apiUrl, private logger: LoggerProvider, private http: Http){ } getTodos(){ this.logger.debug('Items', this.todos); return this.http.get(`${this.apiUrl}/todos`).map(res => res.json()); } }
We add @Inject because 'apiUrl' doesn't have annotation for 'apiUrl'. Angular provide @Inject for this case. @inject is a decorator that we can attach to the constructor parameter so we can annotate them with the required metadata.
Another thing to note is that @inject takes any token, not just strings.
We can also do:
constructor(@Inject(apiUrl) private apiUrl, @Inject(LoggerProvider) private logger, private http: Http){ }
This is useful if we happen to write our Angular 2 application in a language other than TypeScript, where type annotations don't exist.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具