无需构造函数注入即可访问 Aurelia 的依赖注入系统

Get access to Aurelia's Dependency Injection system without constructor injection

有没有一种方法可以在不注入构造函数的情况下访问 Aurelia 的依赖注入系统。

我有一个叫 Box 的 class。我需要知道它的其中一个属性何时发生变化,以便我可以更新我的验证。我发现我可以从这个 .

使用 bindingEngine.propertyObserver

但我的 Box 实例是由 BreezeJs 创建的,而不是 Aurelia。因此,使用 @inject(或在我的情况下为 @autoinject)来获取 bindingEngine 的实例是行不通的。

我看到aurelia.container.get会让我从Aurelia的DI框架中解析。但这需要 Aurelia 对象的当前实例。我能看到的唯一方法是...构造函数注入!

因此,要绕过构造函数注入,您需要...构造函数注入!

我希望我遗漏了一些东西,还有另一种方法可以在没有构造函数注入的情况下获取 bindingEngine 的实例。

注意:现在我只是将我的变量转换为 javascript 属性 并自行触发更改的事件。但我知道这会让我进行脏检查...:(

如果您想知道 breeze 实体的属性何时更改,请使用 entityAspect.propertyChanged 事件:

http://breeze.github.io/doc-js/api-docs/classes/EntityAspect.html#event_propertyChanged

order.entityAspect.propertyChanged.subscribe(
function (propertyChangedArgs) {
    // this code will be executed anytime a property value changes on the 'order' entity.
    var entity = propertyChangedArgs.entity; // Note: entity === order
    var propertyNameChanged = propertyChangedArgs.propertyName;
    var oldValue = propertyChangedArgs.oldValue;
    var newValue = propertyChangedArgs.newValue;
});

不推荐规避构造函数注入。它违反了 dependency inversion principle,但是有一种机制可以这样做:

main.js

export function configure(aurelia) {
  aurelia.container.makeGlobal();
  ...
}

box.js

import {Container} from 'aurelia-dependency-injection';

let bindingEngine = Container.instance.get(BindingEngine);