2016-06-06 3 views
3

Если я создаю вспомогательный класс, например. UserList, в который HttpClient вложил его в него, тогда тот, кто создает экземпляр этого класса, должен будет передать ему объект HttpClient в конструкторе. Должен ли @inject (HttpClient) заботиться о том, чтобы получить синглтон HttpClient и ввести его в конструктор? В противном случае каждый класс, который должен ссылаться на UserList, также получит ссылку на HttpClient, чтобы затем передать его в конструктор UserList (и победить цель инъекции).Инъекция зависимостей Aurelia при создании объектов

UserList.ts

@inject(HttpClient) 
export class UserList { 
    constructor(public http: HttpClient){ 
    } 
... 
} 

DoSomething.ts

export class DoSomething { 
    userList: UserList; 

    constructor(){ 
     this.userList = new UserList(); //doesn't work without passing HttpClient 
    } 
} 

, чтобы сделать эту работу, я должен получить ссылку на HttpClient в классе DoSomething, даже если он не будет использовать его непосредственно , Рабочая версия, которая, кажется, плохо реализован:

DoSomething.ts

@inject(HttpClient) 
export class DoSomething { 
    userList: UserList; 

    constructor(public http: HttpClient){ 
     this.userList = new UserList(http); 
    } 
} 
+0

Импортировать 'inject'? 'import {inject} из 'aurelia-framework';' – Randy

+0

Проблема в опубликованном вами кодексе заключается в том, что вы не держитесь за ссылку на «HttpClient» в «UserList». В любом случае, приведенный ниже ответ JamesCarters верен. –

ответ

6

Правильный способ справиться с этим является использование Factory Разрешителя

import { Factory } from 'aurelia-framework'; 

@inject(Factory.of(UserList)) 
export class DoSomething { 

    userList: UserList; 

    constructor(UserList) { 

     // this is a factory, so you call the function without new 
     this.userList = UserList(); 
    } 
} 

@inject(HttpClient) 
export class UserList { 

    http: HttpClient; 

    constructor(HttpClient) { 
     this.http = HttpClient; 
    } 
} 

Для получения более подробной информации смотрите ответ, приведенный в данном related question, или official docs.

+0

если этот ответ вам полезен, пожалуйста, подтвердите и принимайте –

+1

Ты мужчина. Спасибо, что ответили на мой вопрос main.js qurelia.container! – user441058

+0

https://www.youtube.com/watch?v = uOEESGYyiv0 –

1

Если вы хотите использовать Aurelia dependency injection, вам нужно импортировать необходимые модули:

import {HttpClient} from 'aurelia-fetch-client'; 
import {inject} from 'aurelia-framework'; 

@inject(HttpClient) 
export class DoSomething{ 

    constructor(http){ 
     // do your stuff 
    } 

} 

Это ES6 реализация, тот, который я использую, но я считаю, что все, что вам нужно изменить, это type в constructor.

3

Вам нужно впрыскивать UserList в DoSomething

import {UserList} from 'where-ever-user-list-is'; 
import {inject} from 'aurelia-framework'; 

@inject(UserList) 
export class DoSomething { 
    userList: UserList; 

    constructor(userList){ 
     this.userList = userList 
    } 
} 
+0

или do 'container.get (UserList)' вместо 'new' –

7

Если вы используете машинопись, не беспокойтесь об этом. Используйте @autoinject и увидите, как происходит волшебство!

Как это:

import {autoinject} from 'aurelia-framework'; 

@autoinject() 
export class UserList { 
    constructor(private http: HttpClient){ 
    } 
... 
} 

В другом файле:

import {autoinject} from 'aurelia-framework'; 

@autoinject() 
export class DoSomething { 
    constructor(private userList: UserList){ 
    } 
} 

машинописи компилятор будет выдавать метаданные типа и Aurelia будет читать это инъецирования экземпляры на правильном пути!

Более подробная информации о: http://aurelia.io/docs.html#/aurelia/dependency-injection/1.0.0-beta.1.2.3/doc/article/dependency-injection-basics

+0

Спасибо Эшли Грант, лучшие практики! –