2016-09-16 218 views
0

假設我有下面的類:角2依賴注入 - 注入對象independantly構造

export class Teacher { 
    constructor(public name: String, private age: number){} 
    ... 
} 

Teacher s的這樣的創建:

const firstGradeTeacher: Teacher = new Teacher("Hannah", 32); 

我想一個記錄添加到老師現在。記錄器是Injectable()。我的想法的第一行是要做到這一點:

export class Teacher { 
    constructor(public name: String, private age: number, private logger: Logger){} 
    ... 
} 

不幸的是,這意味着現在大家構建了一個教師需要兩種:

  1. 有一個記錄器或

  2. 知道如何構建一個記錄器

我會真正想要做的是這樣的:

export class Teacher { 
    private logger: Logger = Injector.get(); // <-- Does this exist? 
    constructor(public name: String, private age: number){} 
    ... 
} 

有沒有辦法可以做到這一點?

+0

[存儲噴射器例如用於部件用途]的可能的複製(http://stackoverflow.com/questions/39409328/storing-injector-instance-for-use-in - 組件) – estus

回答

1

根注射器的訪問是可能的a hack

但是,這表示XY問題。班級應該是注射或不注射的。混合這些概念並不是一個好主意,因爲在Angular中沒有慣用的方法來做到這一點。

非注射類工廠是處理這個問題的好方法。

@Injectable() 
class TeacherFactory { 
    constructor(private logger: Logger) {} 

    public createInstance(...args) { 
    const teacher = new Teacher(...args); 

    // or pass it as extra argument if logger is used in Teacher constructor 
    teacher.logger = this.logger; 

    return teacher; 
    } 
} 

@Component({ 
    ... 
    providers: [TeacherFactory] 
}) 
class SomeComponent { 
    constructor(private teacherFactory: TeacherFactory){ 
    const firstGradeTeacher: Teacher = teacherFactory.createInstance("Hannah", 32); 
    } 
} 

或者

// non-injectable class 
class TeacherFactory {} 

@Component({ 
    ... 
    providers: [{ 
    provide: TeacherFactory, 
    deps: [Logger], 
    useFactory: (logger: Logger) => (...args) => { 
     const teacher = new Teacher(...args); 
     teacher.logger = logger; 

     return teacher; 
    } 
    }] 
}) 
class SomeComponent { 
    constructor(private teacherFactory: TeacherFactory){ 
    const firstGradeTeacher: Teacher = teacherFactory("Hannah", 32); 
    } 
} 
-1

我認爲你正在尋找這樣的:

import { Optional } from '@angular/core'; 

export class Teacher { 
    constructor(public name: String, private age: number, @Optional() private logger: Logger) { 
    if (this.logger) { 
     this.logger.log(some_message); 
    } 
    ... 
    } 
... 
} 
+1

不幸的是,當類直接實例化時,這不會使Logger被自動注入,'新教師(...)'。 – estus

+0

我不知道你想要做什麼。我的理解是,你希望你的Logger是一個可選的依賴項,因爲你需要使用@Optional()在構造函數中註釋記錄器。 – Omar

+0

這個問題解釋了教師課堂應該如何使用。注入器會拋出Teacher示例中的Teacher類,因爲其他構造函數註釋(public name:String,private age:number)不是提供者。 – estus