单一实例容器

InstanceContainer 接口是数据容器层次结构的根节点。用来容纳单一实体实例。

在 XML 描述中可以这样定义 InstanceContainer

<data>
    <instance id="customerDc"
              class="ui.ex1.entity.Customer">
        <fetchPlan extends="_base">
            <property name="city" fetchPlan="_base"/>
            <property name="favouriteBrands" fetchPlan="_base"/>
        </fetchPlan>
        <loader/>
        <collection id="favouriteBrandsDc" property="favouriteBrands"/>
    </instance>
</data>

方法

InstanceContainer 有下列方法:

  • setItem() - 为容器设置一个实体实例。

  • getItem() - 返回容器中保存的实例。如果容器是空的,此方法会抛出异常。所以需要在确保容器有设置实体的时候才使用此方法,然后就不需要检查返回值是否为 null

  • getItemOrNull() - 返回容器中保存的实例。如果容器是空的,此方法会返回 null。所以在使用此方法返回值之前总是需要先检查返回的是否是 null

  • getEntityMetaClass() - 返回能存储在此容器的实体的 metaclass。

  • setFetchPlan - 设置在加载容器实体时需要使用的 fetch plan。需要注意的是,容器本身不会加载数据,所以这个属性只是为此容器关联的数据加载器设定 fetch plan。

  • getFetchPlan() - 返回在加载容器实体时需要使用的 fetch plan。

事件

使用 InstanceContainer 接口可以注册以下事件的监听器:

  • ItemPropertyChangeEvent 会在容器中存储的实例的属性值发生变化时发送。下面例子订阅了该事件,容器在界面 XML 中使用 id customerDc 定义:

    @Subscribe(id = "customerDc", target = Target.DATA_CONTAINER)
    public void onCustomerDcItemPropertyChange(
            InstanceContainer.ItemPropertyChangeEvent<Customer> event) {
        Customer customer = event.getItem();
        String changedProperty = event.getProperty();
        Object currentValue = event.getValue();
        Object previousValue = event.getPrevValue();
        // ...
    }
  • ItemChangeEvent 会在为容器设置另一个实例(或者 null)时发送。下面例子订阅了该事件,容器在界面 XML 中使用 id customerDc 定义:

    @Subscribe(id = "customerDc", target = Target.DATA_CONTAINER)
    public void onCustomerDcItemChange(InstanceContainer.ItemChangeEvent<Customer> event) {
        Customer customer = event.getItem();
        Customer previouslySelectedCustomer = event.getPrevItem();
        // ...
    }