2016-09-16 217 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