繁体   English   中英

实体事件订阅清理

[英]Entity event subscriptions clean-up

我正在使用BreezeJS。 假设我们有一个自定义的EntityBase类,并在其实体初始化器方法(以下示例在TypeScript中)中订阅了一些entityAspect事件( propertyChangedvalidationErrorsChanged )和/或其集合属性的事件( arrayChanged ):

import { Entity, EntityAspect } from "breeze-client";

export abstract class EntityBase implements Entity {
    public static initializer(entity: EntityBase): void {
        const entityAspect: EntityAspect = entity.entityAspect;

        entityAspect.propertyChanged.subscribe(EntityBase.propertyChangedHandler);
        entityAspect.validationErrorsChanged.subscribe(EntityBase.validationErrorHandler);
    }
}

export class Contact extends EntityBase {
    /// [Initializer]
    public static initializer(entity: EntityBase): void {
        super.initializer(entity);

        (entity as Contact).addresses.arrayChanged.subscribe(Contact.addressesChangedHandler);
    }
    /// </code>

    // Generated code. Do not place code below this line.
    public addresses: Address[];
}

        // Somewhere where MetadataStore is initialized.
        metadataStore.registerEntityTypeCtor("Contact", Contact, Contact.initializer);

这意味着在实体分离到垃圾被收集之前的某个时间点,我们必须取消订阅这些事件,以防止内存泄漏。 因此,我们有点需要实体终结器/析构函数。

我在Breeze API中没有看到任何明显的插件插入实体生命周期。

有人可以提出如何执行此操作的想法吗?

好吧,我想我明白这个问题。 但是为了确保让我重述此问题并添加一些上下文。 分离实体后,除非您单独对其进行引用,否则它将收集垃圾。 此垃圾回收还将收集对每个实体的“ entityAspect”进行的所有订阅。 因此,您看到泄漏(在垃圾回收之后)的唯一方法是,如果对某个对象的订阅与实体本身(或它的EntityAspect)保持分开。 就您而言,尚不清楚您定义的EntityBase处理程序是静态的还是实例级别的,但是如果是静态的,则需要取消订阅。

为此,Breeze EntityManager具有一个EntityChanged事件 ,可以按如下方式使用该事件

var em = new EntityManager( {serviceName: "api/NorthwindIBModel" });
em.entityChanged.subscribe(function(changeArgs) {
    // This code will be executed any time any entity within the entityManager is added, 
    // modified, deleted or detached for any reason. 
    var action = changeArgs.entityAction;
    var entity = changeArgs.entity;
    // unsubscribe here if detaching.
});

这有意义吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM