【问题标题】:Get access to Aurelia's Dependency Injection system without constructor injection无需构造函数注入即可访问 Aurelia 的依赖注入系统
【发布时间】:2016-10-13 06:35:50
【问题描述】:

有没有办法在没有构造函数注入的情况下访问 Aurelia 的依赖注入系统。

我有一个名为Box 的课程。我需要知道它的属性之一何时发生变化,以便更新我的验证。我发现我可以从这个answer 使用bindingEngine.propertyObserver

但我的Box 实例是由BreezeJs 创建的,而不是Aurelia。所以使用@inject(或者在我的例子中是@autoinject)来获取bindingEngine的实例是行不通的。

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

所以,要绕过构造函数注入,您需要...构造函数注入!

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

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

【问题讨论】:

    标签: javascript aurelia aurelia-di


    【解决方案1】:

    如果您想知道微风实体的属性何时发生变化,请使用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,但是有一种机制可以这样做:

    ma​​in.js

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

    box.js

    import {Container} from 'aurelia-dependency-injection';
    
    let bindingEngine = Container.instance.get(BindingEngine);
    

    【讨论】:

    • 谢谢!使用微风的更改通知是正确的。 (我只是太喜欢 Aurelia 的系统了,我忘了。再次感谢!
    • BindingEngine代替微风的系统不好吗?我连接了绑定引擎,它工作得很好。我想我个人更喜欢BindingEngine,但如果有一个原因,我想知道微风的系统。
    • 如果你使用aurelia-breeze,绑定系统使用的是breeze系统,所以最终你是间接使用breeze系统。我会选择原生微风系统。它避免了绕过构造函数注入的不良模式。
    • @JeremyDanyow 我用aurelia-dependency-injection@1.3.1 试过这个,现在不用aurelia.container.makeGlobal(); 也可以工作。这是预期的行为吗?
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2018-06-17
    • 1970-01-01
    相关资源
    最近更新 更多