- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我知道如何使用 @inject
类装饰器来使用 aurelia 工厂解析器:
@inject(Factory.of(Foo))
export class NeedsFoo {
foo: Foo;
constructor(fooFactory: () => Foo) {
this.foo = fooFactory(config);
}
}
config
是初始化 Foo 实例所需的一些配置状态,不能注入(inject)。
但在一些更大的 View 模型中,@autoinject
更好更容易添加/删除依赖项,但我不知道如何使用参数装饰器来实现同样的事情。
解析器已简要记录 here没有工厂解析器属性的示例。一个相关的错误是 here但我无法弄清楚它的用法。有一堆 SO 问题,但它们都引用了 @inject(Factory.of(...))
如果我尝试以下操作,则 fooFactory 是一个空对象 {}
:
@autoinject()
export class NeedsFoo {
foo: Foo;
constructor(@factory(Foo) fooFactory) {
this.foo = fooFactory(config);
}
}
错误讨论的评论说要这样做:
interface FooFactory {
new (config: any): Foo;
}
class NeedsFoo {
foo: Foo;
constructor(@factory(Foo) fooFactory: FooFactory) {
this.foo = new fooFactory(config); // error!
}
}
但标记的行失败并显示 TypeError: fooFactory is not a constructor.
(它是一个空对象)
我可以使用参数装饰器和自动注入(inject)来使用 Aurelia 注入(inject)一个类的工厂吗?
编辑:将 deps 重命名为 config 这样我就不会传递注入(inject)的依赖项了。
编辑 2:fooFactory 是一个空对象,不是未定义的
最佳答案
你非常接近。只需将 @autoinject()
添加到第二个示例中的 NeedsFoo,去掉 deps
参数,不要忘记添加 @autoinject()
在 Foo 上,如果它有自己的部门。
进一步阐明这是如何/为什么起作用并消除一些误解:
在类上放置任何 装饰器将使 tsc 发出该类的类型元数据。如果类中没有其他装饰器,您只会使用自动注入(inject)。是不是已经有@customElement()
了?不需要 @autoinject()
。
您从不需要将依赖项传递到工厂函数中。它们由工厂函数内的容器检索。
工厂函数不是类构造函数,而是构造函数。以 fooFactory()
或 new fooFactory()
调用它具有相同的效果:它调用函数并返回函数返回的任何内容。
接口(interface)不会编译为 javascript。使用接口(interface)作为参数类型永远不会使 DI 工作。 : FooFactory
这里和说: any
是一样的。这仅用于智能感知。
使用 @factory()
时,您传递给函数的类型将取代参数本身的类型。参数的类型被忽略。
这为您提供了几种替代实现方式。
给定以下类 Foo
@autoinject()
export class Foo {
public bar: Bar;
constructor(bar: Bar) {
this.bar = bar;
}
}
以及这些类中的任何一个 NeedsFoo:
@autoinject()
export class NeedsFoo {
public foo: Foo;
constructor(@factory(Foo) fooFactory: any) {
this.foo = new fooFactory();
}
}
@customElement("needs-foo")
export class NeedsFoo {
public foo: Foo;
constructor(@factory(Foo) fooFactory: FooFactory) {
this.foo = new fooFactory();
}
}
@autoinject()
export class NeedsFoo {
public foo: Foo;
constructor(@factory(Foo) fooFactory: any) {
this.foo = fooFactory();
}
}
@autoinject()
export class NeedsFoo {
public foo: Foo;
constructor(@factory(Foo) fooFactory: FooFactory ) {
this.foo = new fooFactory();
}
}
interface FooFactory {
new(): Foo;
}
它们(以及它们的不同组合)都以相同的方式工作,并为您提供了您所期望的 Foo
实例。
关于typescript - 使用参数修饰(不是类修饰)的 Aurelia 工厂解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49041550/
我在使用 lambda 表达式时遇到问题,该表达式用于自定义过滤来自 DataGridView 的数据。 这是表达式: private static Expression> ExpressionLon
我想使用装饰器模式扩展 basic_streambuf 对象的行为。这就是我目前得到的: template class forwarding_basic_streambuf : boost::
我正在编写一个 Backbone 应用程序,我想编写一个经过身份验证的装饰器,我可以用它来装饰路由器类中的方法(路由)列表。 所以我有一个带有几种方法的路由器,并尝试过类似的方法。但是,当我调用我想要
我想重写 alert() Javascript 函数,同时保留它的“聚焦”行为。即,自定义方面,同时将焦点带到打开弹出窗口的浏览器选项卡。 最佳答案 无法直接自定义/装饰 JavaScript 警报框
我们如何在 jquery mobile 中实现事件行为内部的 touch up。 我希望它的行为与 native ios 按钮完全相同。我们可以点击并按住点击并在按钮内移动手指只有当我在按钮内释放时才
我正在尝试覆盖模块(connect-mongo)中的类。该模块的工作原理大致如下: 在server.js中: const session = require('express-session'); c
我希望使用托管代码在非托管 C++ DLL 上加载库,然后在已损坏的外部函数上调用 GetProcAddress。我的问题是,您从 C++ 编译器获得的错位名称是否具有确定性?即:如果原始签名未更改,
为什么我不能使用 @staticmethod 装饰器使类的 __call__ 方法静态化? class Foo(object): @staticmethod def bar():
我有一个小的 Delphi 10.3.3 应用程序,它有一些文本编辑功能,使用用户输入文本的 TMemo。 我正在尝试包含一些格式选项,如本网站提供的内容: http://qaz.wtf/u/conv
这是我关于使用 Swift 运行的 iOS 应用程序的情况。 我有一个下载按钮,触摸后即可开始下载文件: @IBAction func downloadButtonPressed() { if
我有一个 View ,我需要检测一个属性是否用隐藏输入装饰。 我的属性(property)被定义为: [HiddenInput(DisplayValue = false)] public string
我在我的 Qt 应用程序中绘制线和点,但在 QPainter 中似乎存在缩放错误时遇到了问题。我的线条工作得很好,但点会受到某些缩放转换的影响,尽管笔被设置为“化妆品”。最让我困扰的是似乎只有一个轴(
我在 Eclipse 中遇到 Java 语法着色问题。我正在尝试更改 Eclipse 中 JUST java 修饰符的文本颜色(如公共(public)、 protected 、私有(private))
我在站点上有一些限制区域,我想为其指定 login_required 装饰器。但是我想在主 urls.py 中每次包含一次,而不是包含 urls.py 中的每个单独的 url 所以代替: /priva
这个建议似乎很有意义,因为该方法中没有使用 self,但现在我很好奇: 这是对 CBV 的疏忽吗?用户应该手动装饰每个 @staticmethod? Django 中是否已经有一些代码可以自动使所有
python 3.3:我可以装饰一个函数来忽略所有与命名参数不匹配的位置参数吗? import functools def ignore_star_args(): def wrapper(fu
我是一名优秀的程序员,十分优秀!