How do I do dependency injection with service in Angular 5?
How do I do dependency injection with service?
I got the typescript notification:
[Angular] Can't resolve all parameters for LandingComponent in
landing.component.ts:
([object Object], ?).
Update
I shouldn't do just use LangService in constructor like this:
private _langService: LangService;
Because LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
Service and it's interface
export interface ILangService {
}
export class LangService implements ILangService {
}
Component
import { ILangService } from '../../services/Ilang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
private langService: ILangService
constructor(
private http: HttpClient,
_langService: ILangService;
) {
this._langService = langService;
}
}
app.module.ts
import { ILangService } from './services/Ilang.service';
import { LangService } from './services/Lang.service';
@NgModule({
declarations: [
AppComponent,
LandingComponent,
],
imports: [
BrowserModule,
HttpClientModule,
RouterModule.forRoot([
{ path: '', component: LandingComponent },
], { useHash: false }),
],
providers: [
LangService
],
bootstrap: [AppComponent]
})
export class AppModule { }
angular service dependency-injection
add a comment |
How do I do dependency injection with service?
I got the typescript notification:
[Angular] Can't resolve all parameters for LandingComponent in
landing.component.ts:
([object Object], ?).
Update
I shouldn't do just use LangService in constructor like this:
private _langService: LangService;
Because LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
Service and it's interface
export interface ILangService {
}
export class LangService implements ILangService {
}
Component
import { ILangService } from '../../services/Ilang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
private langService: ILangService
constructor(
private http: HttpClient,
_langService: ILangService;
) {
this._langService = langService;
}
}
app.module.ts
import { ILangService } from './services/Ilang.service';
import { LangService } from './services/Lang.service';
@NgModule({
declarations: [
AppComponent,
LandingComponent,
],
imports: [
BrowserModule,
HttpClientModule,
RouterModule.forRoot([
{ path: '', component: LandingComponent },
], { useHash: false }),
],
providers: [
LangService
],
bootstrap: [AppComponent]
})
export class AppModule { }
angular service dependency-injection
In your landing component, you just have to doprivate _langService: langService;
that's it and remove all those extra stuff
– Suryan
Nov 12 '18 at 1:05
@Suryan LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 1:21
add a comment |
How do I do dependency injection with service?
I got the typescript notification:
[Angular] Can't resolve all parameters for LandingComponent in
landing.component.ts:
([object Object], ?).
Update
I shouldn't do just use LangService in constructor like this:
private _langService: LangService;
Because LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
Service and it's interface
export interface ILangService {
}
export class LangService implements ILangService {
}
Component
import { ILangService } from '../../services/Ilang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
private langService: ILangService
constructor(
private http: HttpClient,
_langService: ILangService;
) {
this._langService = langService;
}
}
app.module.ts
import { ILangService } from './services/Ilang.service';
import { LangService } from './services/Lang.service';
@NgModule({
declarations: [
AppComponent,
LandingComponent,
],
imports: [
BrowserModule,
HttpClientModule,
RouterModule.forRoot([
{ path: '', component: LandingComponent },
], { useHash: false }),
],
providers: [
LangService
],
bootstrap: [AppComponent]
})
export class AppModule { }
angular service dependency-injection
How do I do dependency injection with service?
I got the typescript notification:
[Angular] Can't resolve all parameters for LandingComponent in
landing.component.ts:
([object Object], ?).
Update
I shouldn't do just use LangService in constructor like this:
private _langService: LangService;
Because LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
Service and it's interface
export interface ILangService {
}
export class LangService implements ILangService {
}
Component
import { ILangService } from '../../services/Ilang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
private langService: ILangService
constructor(
private http: HttpClient,
_langService: ILangService;
) {
this._langService = langService;
}
}
app.module.ts
import { ILangService } from './services/Ilang.service';
import { LangService } from './services/Lang.service';
@NgModule({
declarations: [
AppComponent,
LandingComponent,
],
imports: [
BrowserModule,
HttpClientModule,
RouterModule.forRoot([
{ path: '', component: LandingComponent },
], { useHash: false }),
],
providers: [
LangService
],
bootstrap: [AppComponent]
})
export class AppModule { }
angular service dependency-injection
angular service dependency-injection
edited Nov 14 '18 at 8:47
j3ff
1,85311125
1,85311125
asked Nov 12 '18 at 0:50
mr_blond
15911
15911
In your landing component, you just have to doprivate _langService: langService;
that's it and remove all those extra stuff
– Suryan
Nov 12 '18 at 1:05
@Suryan LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 1:21
add a comment |
In your landing component, you just have to doprivate _langService: langService;
that's it and remove all those extra stuff
– Suryan
Nov 12 '18 at 1:05
@Suryan LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 1:21
In your landing component, you just have to do
private _langService: langService;
that's it and remove all those extra stuff– Suryan
Nov 12 '18 at 1:05
In your landing component, you just have to do
private _langService: langService;
that's it and remove all those extra stuff– Suryan
Nov 12 '18 at 1:05
@Suryan LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 1:21
@Suryan LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 1:21
add a comment |
3 Answers
3
active
oldest
votes
Updated Answer
If you want to use different implementations for the same service you should create an InjectionToken<T> and provide the right implementation for your interface in your module declarations.
Interface - lang.service.ts
Create an injection token that will be recognized by the injector typed with ILangService
interface
export const LangService = new InjectionToken<ILangService>('LangService');
export interface ILangService { }
1st module - english.module.ts
Provide EnglishLangService
for the LangService
injection token where EnglishLangService
implements ILangService
interface
import { LangService } from './services/lang.service';
import { EnglishLangService } from './services/english-lang.service';
@NgModule({
declarations: [ LandingComponent ],
providers: [
{ provide: LangService, useClass: EnglishLangService }
]
})
export class EnglishModule { }
2nd module - french.module.ts
Provide FrenchLangService
for the LangService
injection token where FrenchLangService
implements ILangService
interface
import { LangService } from './services/lang.service';
import { FrenchLangService } from './services/french-lang.service';
@NgModule({
declarations: [ LandingComponent ],
providers: [
{ provide: LangService, useClass: FrenchLangService }
]
})
export class FrenchModule { }
Component - landing.component.ts
This way you can inject LangService
in your component and the injector will retrieve the implementation provided in your module
import { LangService } from '../../services/lang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
constructor(
private http: HttpClient,
private langService: LangService,
) { }
}
Testing - mock-lang.service.ts
When testing you will be able to provide your mock implementation the same way you provide the right implementation in your application modules
import { LangService } from './services/lang.service';
import { MockLangService } from './services/mock-lang.service';
TestBed.configureTestingModule({
providers: [
{ provide: LangService, useClass: MockLangService },
],
});
Original Answer
You should import your service with the class instead of the interface
import { LangService } from '../../services/lang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
constructor(
private http: HttpClient,
private langService: LangService;
) { }
}
Also don't forget to set the @Injectable()
decorator on your service class declaration
import { Injectable } from '@angular/core';
@Injectable()
export class LangService implements ILangService { }
And of course, you have to provide the service to your module
import { LangService } from './services/Lang.service';
@NgModule({
declarations: [
AppComponent,
LandingComponent,
],
imports: [ ... ],
providers: [
LangService
],
bootstrap: [AppComponent]
})
export class AppModule { }
You can read about Angular Dependency Injection here: https://angular.io/guide/dependency-injection
Another interesting link for advance service declarations: https://offering.solutions/blog/articles/2018/08/17/using-useclass-usefactory-usevalue-useexisting-with-treeshakable-providers-in-angular/
LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 10:40
I updated the answer
– j3ff
Nov 12 '18 at 15:43
add a comment |
service.ts
import { Injectable } from '@angular/core';
import { HttpClient, Response, RequestOptions, Headers } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
export interface ILangService {
}
@Injectable()
export class LangService implements ILangService {
constructor(private http: HttpClient) { <-- httpclient for angular6
}
getData(): Observable<any> {
return this.http.get('https://..../');
.map(this.extractData)
.catch(this.handleError);
}
private extractData(res: Response) {
const body = res.json();
return body || ;
}
private handleError(error: any) {
const errMsg = (error.message) ? error.message :
error.status ? `${error.status} - ${error.statusText}` : 'Server error';
console.error(errMsg);
console.log('Error....!');
return Observable.throw(errMsg);
}
}
Component:-
import { LangService } from '../../services/lang.service'; <-- Import sevice here
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
constructor(
private http: HttpClient,
_langService: LangService <--- service
) { }
ngOnInit() {
let thisx = this;
this._langService.getData().subscribe(
function (success) {
// alert here on success
alert (success);
},
error => console.log('Getting Server Data Error :: ' +
JSON.stringify(error)));
}
}
LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 10:40
add a comment |
LangService shoul be removed from app.module.ts providers:
@NgModule({
declarations: [
AppComponent,
LandingComponent,
],
imports: [
BrowserModule,
HttpClientModule,
RouterModule.forRoot([
{ path: '', component: LandingComponent },
], { useHash: false }),
],
providers: ,
bootstrap: [AppComponent]
})
export class AppModule { }
And interface should be added to providers in component:
import { LangService } from '../../services/Lang.service';
import { ILangService } from '../../services/ILang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less'],
providers: [
{ provide: ILangService, useClass: LangService }
]
})
export class LandingComponent {
private langService: ILangService
constructor(
private http: HttpClient,
_langService: ILangService;
) {
this._langService = langService;
}
}
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53254749%2fhow-do-i-do-dependency-injection-with-service-in-angular-5%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
Updated Answer
If you want to use different implementations for the same service you should create an InjectionToken<T> and provide the right implementation for your interface in your module declarations.
Interface - lang.service.ts
Create an injection token that will be recognized by the injector typed with ILangService
interface
export const LangService = new InjectionToken<ILangService>('LangService');
export interface ILangService { }
1st module - english.module.ts
Provide EnglishLangService
for the LangService
injection token where EnglishLangService
implements ILangService
interface
import { LangService } from './services/lang.service';
import { EnglishLangService } from './services/english-lang.service';
@NgModule({
declarations: [ LandingComponent ],
providers: [
{ provide: LangService, useClass: EnglishLangService }
]
})
export class EnglishModule { }
2nd module - french.module.ts
Provide FrenchLangService
for the LangService
injection token where FrenchLangService
implements ILangService
interface
import { LangService } from './services/lang.service';
import { FrenchLangService } from './services/french-lang.service';
@NgModule({
declarations: [ LandingComponent ],
providers: [
{ provide: LangService, useClass: FrenchLangService }
]
})
export class FrenchModule { }
Component - landing.component.ts
This way you can inject LangService
in your component and the injector will retrieve the implementation provided in your module
import { LangService } from '../../services/lang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
constructor(
private http: HttpClient,
private langService: LangService,
) { }
}
Testing - mock-lang.service.ts
When testing you will be able to provide your mock implementation the same way you provide the right implementation in your application modules
import { LangService } from './services/lang.service';
import { MockLangService } from './services/mock-lang.service';
TestBed.configureTestingModule({
providers: [
{ provide: LangService, useClass: MockLangService },
],
});
Original Answer
You should import your service with the class instead of the interface
import { LangService } from '../../services/lang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
constructor(
private http: HttpClient,
private langService: LangService;
) { }
}
Also don't forget to set the @Injectable()
decorator on your service class declaration
import { Injectable } from '@angular/core';
@Injectable()
export class LangService implements ILangService { }
And of course, you have to provide the service to your module
import { LangService } from './services/Lang.service';
@NgModule({
declarations: [
AppComponent,
LandingComponent,
],
imports: [ ... ],
providers: [
LangService
],
bootstrap: [AppComponent]
})
export class AppModule { }
You can read about Angular Dependency Injection here: https://angular.io/guide/dependency-injection
Another interesting link for advance service declarations: https://offering.solutions/blog/articles/2018/08/17/using-useclass-usefactory-usevalue-useexisting-with-treeshakable-providers-in-angular/
LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 10:40
I updated the answer
– j3ff
Nov 12 '18 at 15:43
add a comment |
Updated Answer
If you want to use different implementations for the same service you should create an InjectionToken<T> and provide the right implementation for your interface in your module declarations.
Interface - lang.service.ts
Create an injection token that will be recognized by the injector typed with ILangService
interface
export const LangService = new InjectionToken<ILangService>('LangService');
export interface ILangService { }
1st module - english.module.ts
Provide EnglishLangService
for the LangService
injection token where EnglishLangService
implements ILangService
interface
import { LangService } from './services/lang.service';
import { EnglishLangService } from './services/english-lang.service';
@NgModule({
declarations: [ LandingComponent ],
providers: [
{ provide: LangService, useClass: EnglishLangService }
]
})
export class EnglishModule { }
2nd module - french.module.ts
Provide FrenchLangService
for the LangService
injection token where FrenchLangService
implements ILangService
interface
import { LangService } from './services/lang.service';
import { FrenchLangService } from './services/french-lang.service';
@NgModule({
declarations: [ LandingComponent ],
providers: [
{ provide: LangService, useClass: FrenchLangService }
]
})
export class FrenchModule { }
Component - landing.component.ts
This way you can inject LangService
in your component and the injector will retrieve the implementation provided in your module
import { LangService } from '../../services/lang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
constructor(
private http: HttpClient,
private langService: LangService,
) { }
}
Testing - mock-lang.service.ts
When testing you will be able to provide your mock implementation the same way you provide the right implementation in your application modules
import { LangService } from './services/lang.service';
import { MockLangService } from './services/mock-lang.service';
TestBed.configureTestingModule({
providers: [
{ provide: LangService, useClass: MockLangService },
],
});
Original Answer
You should import your service with the class instead of the interface
import { LangService } from '../../services/lang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
constructor(
private http: HttpClient,
private langService: LangService;
) { }
}
Also don't forget to set the @Injectable()
decorator on your service class declaration
import { Injectable } from '@angular/core';
@Injectable()
export class LangService implements ILangService { }
And of course, you have to provide the service to your module
import { LangService } from './services/Lang.service';
@NgModule({
declarations: [
AppComponent,
LandingComponent,
],
imports: [ ... ],
providers: [
LangService
],
bootstrap: [AppComponent]
})
export class AppModule { }
You can read about Angular Dependency Injection here: https://angular.io/guide/dependency-injection
Another interesting link for advance service declarations: https://offering.solutions/blog/articles/2018/08/17/using-useclass-usefactory-usevalue-useexisting-with-treeshakable-providers-in-angular/
LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 10:40
I updated the answer
– j3ff
Nov 12 '18 at 15:43
add a comment |
Updated Answer
If you want to use different implementations for the same service you should create an InjectionToken<T> and provide the right implementation for your interface in your module declarations.
Interface - lang.service.ts
Create an injection token that will be recognized by the injector typed with ILangService
interface
export const LangService = new InjectionToken<ILangService>('LangService');
export interface ILangService { }
1st module - english.module.ts
Provide EnglishLangService
for the LangService
injection token where EnglishLangService
implements ILangService
interface
import { LangService } from './services/lang.service';
import { EnglishLangService } from './services/english-lang.service';
@NgModule({
declarations: [ LandingComponent ],
providers: [
{ provide: LangService, useClass: EnglishLangService }
]
})
export class EnglishModule { }
2nd module - french.module.ts
Provide FrenchLangService
for the LangService
injection token where FrenchLangService
implements ILangService
interface
import { LangService } from './services/lang.service';
import { FrenchLangService } from './services/french-lang.service';
@NgModule({
declarations: [ LandingComponent ],
providers: [
{ provide: LangService, useClass: FrenchLangService }
]
})
export class FrenchModule { }
Component - landing.component.ts
This way you can inject LangService
in your component and the injector will retrieve the implementation provided in your module
import { LangService } from '../../services/lang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
constructor(
private http: HttpClient,
private langService: LangService,
) { }
}
Testing - mock-lang.service.ts
When testing you will be able to provide your mock implementation the same way you provide the right implementation in your application modules
import { LangService } from './services/lang.service';
import { MockLangService } from './services/mock-lang.service';
TestBed.configureTestingModule({
providers: [
{ provide: LangService, useClass: MockLangService },
],
});
Original Answer
You should import your service with the class instead of the interface
import { LangService } from '../../services/lang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
constructor(
private http: HttpClient,
private langService: LangService;
) { }
}
Also don't forget to set the @Injectable()
decorator on your service class declaration
import { Injectable } from '@angular/core';
@Injectable()
export class LangService implements ILangService { }
And of course, you have to provide the service to your module
import { LangService } from './services/Lang.service';
@NgModule({
declarations: [
AppComponent,
LandingComponent,
],
imports: [ ... ],
providers: [
LangService
],
bootstrap: [AppComponent]
})
export class AppModule { }
You can read about Angular Dependency Injection here: https://angular.io/guide/dependency-injection
Another interesting link for advance service declarations: https://offering.solutions/blog/articles/2018/08/17/using-useclass-usefactory-usevalue-useexisting-with-treeshakable-providers-in-angular/
Updated Answer
If you want to use different implementations for the same service you should create an InjectionToken<T> and provide the right implementation for your interface in your module declarations.
Interface - lang.service.ts
Create an injection token that will be recognized by the injector typed with ILangService
interface
export const LangService = new InjectionToken<ILangService>('LangService');
export interface ILangService { }
1st module - english.module.ts
Provide EnglishLangService
for the LangService
injection token where EnglishLangService
implements ILangService
interface
import { LangService } from './services/lang.service';
import { EnglishLangService } from './services/english-lang.service';
@NgModule({
declarations: [ LandingComponent ],
providers: [
{ provide: LangService, useClass: EnglishLangService }
]
})
export class EnglishModule { }
2nd module - french.module.ts
Provide FrenchLangService
for the LangService
injection token where FrenchLangService
implements ILangService
interface
import { LangService } from './services/lang.service';
import { FrenchLangService } from './services/french-lang.service';
@NgModule({
declarations: [ LandingComponent ],
providers: [
{ provide: LangService, useClass: FrenchLangService }
]
})
export class FrenchModule { }
Component - landing.component.ts
This way you can inject LangService
in your component and the injector will retrieve the implementation provided in your module
import { LangService } from '../../services/lang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
constructor(
private http: HttpClient,
private langService: LangService,
) { }
}
Testing - mock-lang.service.ts
When testing you will be able to provide your mock implementation the same way you provide the right implementation in your application modules
import { LangService } from './services/lang.service';
import { MockLangService } from './services/mock-lang.service';
TestBed.configureTestingModule({
providers: [
{ provide: LangService, useClass: MockLangService },
],
});
Original Answer
You should import your service with the class instead of the interface
import { LangService } from '../../services/lang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
constructor(
private http: HttpClient,
private langService: LangService;
) { }
}
Also don't forget to set the @Injectable()
decorator on your service class declaration
import { Injectable } from '@angular/core';
@Injectable()
export class LangService implements ILangService { }
And of course, you have to provide the service to your module
import { LangService } from './services/Lang.service';
@NgModule({
declarations: [
AppComponent,
LandingComponent,
],
imports: [ ... ],
providers: [
LangService
],
bootstrap: [AppComponent]
})
export class AppModule { }
You can read about Angular Dependency Injection here: https://angular.io/guide/dependency-injection
Another interesting link for advance service declarations: https://offering.solutions/blog/articles/2018/08/17/using-useclass-usefactory-usevalue-useexisting-with-treeshakable-providers-in-angular/
edited Nov 12 '18 at 17:42
answered Nov 12 '18 at 1:47
j3ff
1,85311125
1,85311125
LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 10:40
I updated the answer
– j3ff
Nov 12 '18 at 15:43
add a comment |
LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 10:40
I updated the answer
– j3ff
Nov 12 '18 at 15:43
LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 10:40
LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 10:40
I updated the answer
– j3ff
Nov 12 '18 at 15:43
I updated the answer
– j3ff
Nov 12 '18 at 15:43
add a comment |
service.ts
import { Injectable } from '@angular/core';
import { HttpClient, Response, RequestOptions, Headers } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
export interface ILangService {
}
@Injectable()
export class LangService implements ILangService {
constructor(private http: HttpClient) { <-- httpclient for angular6
}
getData(): Observable<any> {
return this.http.get('https://..../');
.map(this.extractData)
.catch(this.handleError);
}
private extractData(res: Response) {
const body = res.json();
return body || ;
}
private handleError(error: any) {
const errMsg = (error.message) ? error.message :
error.status ? `${error.status} - ${error.statusText}` : 'Server error';
console.error(errMsg);
console.log('Error....!');
return Observable.throw(errMsg);
}
}
Component:-
import { LangService } from '../../services/lang.service'; <-- Import sevice here
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
constructor(
private http: HttpClient,
_langService: LangService <--- service
) { }
ngOnInit() {
let thisx = this;
this._langService.getData().subscribe(
function (success) {
// alert here on success
alert (success);
},
error => console.log('Getting Server Data Error :: ' +
JSON.stringify(error)));
}
}
LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 10:40
add a comment |
service.ts
import { Injectable } from '@angular/core';
import { HttpClient, Response, RequestOptions, Headers } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
export interface ILangService {
}
@Injectable()
export class LangService implements ILangService {
constructor(private http: HttpClient) { <-- httpclient for angular6
}
getData(): Observable<any> {
return this.http.get('https://..../');
.map(this.extractData)
.catch(this.handleError);
}
private extractData(res: Response) {
const body = res.json();
return body || ;
}
private handleError(error: any) {
const errMsg = (error.message) ? error.message :
error.status ? `${error.status} - ${error.statusText}` : 'Server error';
console.error(errMsg);
console.log('Error....!');
return Observable.throw(errMsg);
}
}
Component:-
import { LangService } from '../../services/lang.service'; <-- Import sevice here
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
constructor(
private http: HttpClient,
_langService: LangService <--- service
) { }
ngOnInit() {
let thisx = this;
this._langService.getData().subscribe(
function (success) {
// alert here on success
alert (success);
},
error => console.log('Getting Server Data Error :: ' +
JSON.stringify(error)));
}
}
LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 10:40
add a comment |
service.ts
import { Injectable } from '@angular/core';
import { HttpClient, Response, RequestOptions, Headers } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
export interface ILangService {
}
@Injectable()
export class LangService implements ILangService {
constructor(private http: HttpClient) { <-- httpclient for angular6
}
getData(): Observable<any> {
return this.http.get('https://..../');
.map(this.extractData)
.catch(this.handleError);
}
private extractData(res: Response) {
const body = res.json();
return body || ;
}
private handleError(error: any) {
const errMsg = (error.message) ? error.message :
error.status ? `${error.status} - ${error.statusText}` : 'Server error';
console.error(errMsg);
console.log('Error....!');
return Observable.throw(errMsg);
}
}
Component:-
import { LangService } from '../../services/lang.service'; <-- Import sevice here
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
constructor(
private http: HttpClient,
_langService: LangService <--- service
) { }
ngOnInit() {
let thisx = this;
this._langService.getData().subscribe(
function (success) {
// alert here on success
alert (success);
},
error => console.log('Getting Server Data Error :: ' +
JSON.stringify(error)));
}
}
service.ts
import { Injectable } from '@angular/core';
import { HttpClient, Response, RequestOptions, Headers } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
export interface ILangService {
}
@Injectable()
export class LangService implements ILangService {
constructor(private http: HttpClient) { <-- httpclient for angular6
}
getData(): Observable<any> {
return this.http.get('https://..../');
.map(this.extractData)
.catch(this.handleError);
}
private extractData(res: Response) {
const body = res.json();
return body || ;
}
private handleError(error: any) {
const errMsg = (error.message) ? error.message :
error.status ? `${error.status} - ${error.statusText}` : 'Server error';
console.error(errMsg);
console.log('Error....!');
return Observable.throw(errMsg);
}
}
Component:-
import { LangService } from '../../services/lang.service'; <-- Import sevice here
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less']
})
export class LandingComponent {
constructor(
private http: HttpClient,
_langService: LangService <--- service
) { }
ngOnInit() {
let thisx = this;
this._langService.getData().subscribe(
function (success) {
// alert here on success
alert (success);
},
error => console.log('Getting Server Data Error :: ' +
JSON.stringify(error)));
}
}
edited Nov 12 '18 at 3:24
answered Nov 12 '18 at 3:18
Mahi
690319
690319
LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 10:40
add a comment |
LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 10:40
LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 10:40
LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 10:40
add a comment |
LangService shoul be removed from app.module.ts providers:
@NgModule({
declarations: [
AppComponent,
LandingComponent,
],
imports: [
BrowserModule,
HttpClientModule,
RouterModule.forRoot([
{ path: '', component: LandingComponent },
], { useHash: false }),
],
providers: ,
bootstrap: [AppComponent]
})
export class AppModule { }
And interface should be added to providers in component:
import { LangService } from '../../services/Lang.service';
import { ILangService } from '../../services/ILang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less'],
providers: [
{ provide: ILangService, useClass: LangService }
]
})
export class LandingComponent {
private langService: ILangService
constructor(
private http: HttpClient,
_langService: ILangService;
) {
this._langService = langService;
}
}
add a comment |
LangService shoul be removed from app.module.ts providers:
@NgModule({
declarations: [
AppComponent,
LandingComponent,
],
imports: [
BrowserModule,
HttpClientModule,
RouterModule.forRoot([
{ path: '', component: LandingComponent },
], { useHash: false }),
],
providers: ,
bootstrap: [AppComponent]
})
export class AppModule { }
And interface should be added to providers in component:
import { LangService } from '../../services/Lang.service';
import { ILangService } from '../../services/ILang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less'],
providers: [
{ provide: ILangService, useClass: LangService }
]
})
export class LandingComponent {
private langService: ILangService
constructor(
private http: HttpClient,
_langService: ILangService;
) {
this._langService = langService;
}
}
add a comment |
LangService shoul be removed from app.module.ts providers:
@NgModule({
declarations: [
AppComponent,
LandingComponent,
],
imports: [
BrowserModule,
HttpClientModule,
RouterModule.forRoot([
{ path: '', component: LandingComponent },
], { useHash: false }),
],
providers: ,
bootstrap: [AppComponent]
})
export class AppModule { }
And interface should be added to providers in component:
import { LangService } from '../../services/Lang.service';
import { ILangService } from '../../services/ILang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less'],
providers: [
{ provide: ILangService, useClass: LangService }
]
})
export class LandingComponent {
private langService: ILangService
constructor(
private http: HttpClient,
_langService: ILangService;
) {
this._langService = langService;
}
}
LangService shoul be removed from app.module.ts providers:
@NgModule({
declarations: [
AppComponent,
LandingComponent,
],
imports: [
BrowserModule,
HttpClientModule,
RouterModule.forRoot([
{ path: '', component: LandingComponent },
], { useHash: false }),
],
providers: ,
bootstrap: [AppComponent]
})
export class AppModule { }
And interface should be added to providers in component:
import { LangService } from '../../services/Lang.service';
import { ILangService } from '../../services/ILang.service';
@Component({
selector: 'app-landing',
templateUrl: './landing.component.html',
styleUrls: ['./landing.component.less'],
providers: [
{ provide: ILangService, useClass: LangService }
]
})
export class LandingComponent {
private langService: ILangService
constructor(
private http: HttpClient,
_langService: ILangService;
) {
this._langService = langService;
}
}
answered Nov 12 '18 at 12:17
mr_blond
15911
15911
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53254749%2fhow-do-i-do-dependency-injection-with-service-in-angular-5%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
In your landing component, you just have to do
private _langService: langService;
that's it and remove all those extra stuff– Suryan
Nov 12 '18 at 1:05
@Suryan LangService is a implementation. In real case there will be few implementations like LangMockedSerives, langService_01, langService_02. Thereby landing component should know nothig about implementation and work with interfaces only.
– mr_blond
Nov 12 '18 at 1:21