Angular 2 - 如何将依赖项注入到自定义类中,该类不是组件并且不作为服务公开

Posted

技术标签:

【中文标题】Angular 2 - 如何将依赖项注入到自定义类中,该类不是组件并且不作为服务公开【英文标题】:Angular 2 - how to inject dependencies to custom class which is not a component and isn't exposed as service 【发布时间】:2016-05-15 11:30:31 【问题描述】:

我们正在开发使用 TypeScript 和 Angular 2 编写的大型应用程序,但我在理解如何以自定义方式使用 Angular 2 注入器时遇到了一个重大问题。实际上,我不确定我是否正在尝试做一些框架不打算做的事情,但到目前为止,我发现我尝试做的事情只有不好的解决方案......

所以,我想要实现的是将 Injector 中的值应用于未包含 @Component 行为且未作为服务暴露给 Injector 的类,映射到全局或组件级注入器。 (我想我非常了解如何在这两个范围内注入东西,而且效果很好)。

我想要的是这样的:

export class SomeCustomClass 
    constructor(injection:InjectionToken) 
        console.log('injection', injection);
    

而且我确实知道,如果我将这个类添加到引导程序中的注入器,或者作为@component 装饰器的一部分,它会很好用。问题是这不是我打算做的。

我需要的是这样的:

factory.createInstanceWithInjectionApplied(SomeCustomClass);

我其实可以接受简单的:

var instance:SomeCustomClass = new SomeCustomClass();

但这似乎不太现实。

哦,是的,我已经尝试了所有我能想到的方法——@Injectable() 对这样创建的实例什么都不做,Injector.createAndResolve 似乎也不起作用,并且保持某种静态属性可以访问应用程序注射器似乎也不是一个好主意。

提前致谢!

【问题讨论】:

您已经找到解决方案了吗? 【参考方案1】:

您是否尝试使用Injector 类?

这是一个示例:

var injector = Injector.resolveAndCreate([Car, Engine]);
var car = injector.get(Car);

还有一个:

export class SomeCustomClass 
  constructor(injector:Injector) 
    (...)
  

【讨论】:

这将创建全新的注入器,而无需参考可以并且实际上是自己注入它的父级,但不是已经在 main Injector 中定义的东西。 var injector = appInjector.resolveAndCreateChild([SomeCustomClass]); injector.get(SomeCustomClass)); 成功了。这也需要对应用程序注入器的现有引用,这实际上是应用注入值的必然条件。谢谢,我想我现在明白了! 您可以在引导级别获取应用程序注入器的实例:bootstrap(AppComponent).then((componentRef) => console.log(componentRef.injector); );。然后你需要找到一种方法在你想使用它的地方提供它...... 我知道。唯一的问题是这种方法会有点制动模块化。不过我会想办法的。 是的,同意你的意见!

以上是关于Angular 2 - 如何将依赖项注入到自定义类中,该类不是组件并且不作为服务公开的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular-Fullstack 生成的 Angular 1.5 组件中注入依赖项

将依赖项注入Singleton类

Angular依赖注入小解

Azure webjobs - Unity - 如何将范围内的依赖项注入其他类

如何将依赖项注入到 Spring 中的自实例化对象中?

需要将“活动”类添加到自定义 WordPress 导航菜单