typescript - Injicera en tjänst i en modellklass Angular


Anta att jag har en tjänst som innehåller information om den inloggade användaren i min Angular-applikation. Jag har en modell som heter Sell som innehåller ett fält som är användarens id som skapar ett Sell-objekt. Finns det ett sätt att injicera (jag vet inte om "injicera" är det bästa ordet här) användartjänsten i modellen på ett sådant sätt att när konstruktorn anropas tar Sell användarens id automatiskt och tilldelar det till objektet?

Exempel :

user.service.ts

...
@Injectable()
export class UserService {
  private _id: string = 'some_id';

  get id(): string {
    return this._id;
  }    
}

sell.model.ts

export class Sell {
  userId: string;
  price: number;
  ...

  constructor() {
    // some way to have userService here
    this.userId = this.userService.id;
  }
}

some.component.ts

import { Component } from '@angular/core';
import { Sell } from '../models/sell.model';

@Component({
  ...
})
export class SomeComponent {

  newSell() {
    let sell = new Sell();
    // with this line, I'd want that the model itself assign user id
    // to its object.
    console.log(sell.userId) // some_id
  }
}

Svar #1

Det du försöker göra är rimligt, sättet du försöker göra det på anses vara en dålig praxis (stor flame war förr i tiden så jag kommer inte gå in på det)

Ett av de bättre sätten att göra något sådant är att använda fabriker för att konstruera dina objekt.

Så din kod skulle se ut så här:

// Component needing model
@Component(...)
class SomeComponent {
    constructor(sellFactory: SellFactoryService){
        const sell = sellFactory.getNewSell();
        console.log(sell.userId)

}

/// Sell factory
@Injectable()
class SellFactoryService {
    constructor(private _userService: UserService){ 
    }

    getNewSell(){
       const sell = new Sell();
       sell.userId = this._userService.id;
       return sell;
    }
}

// Your sell class remains dumb (btw Sale would be a much better name for a model)
export class Sell {
  userId: string;
  price: number;
}

På det här sättet förblir allt avkopplat och testbart.

Svar #2

Du borde inte injicera tjänst där. Säljklassen skulle bli alldeles för 'smart' då. Jag tror att det finns två lämpliga sätt att göra det på:

Injicera UserService i SomeComponent (lägg bara till det i konstruktorn), och gör sedan

let sell = new Sell(this.userService.id);

Det andra sättet är att skapa en annan SellService, som kommer att ha UserService injicerad. Den kommer att ha metoden createNewSell(), som kommer att vara samma som kodsnutten ovan.

Relaterade artiklar