2

提供的示例“实体继承”具有以下实体模型:
- 客户
- 公司扩展客户
- 人员扩展客户
- 订单

OrderEdit 屏幕显示如何处理与可能是公司或个人的客户关联的字段的继承。这是非常清楚的。

但是,Company 和 Person 的编辑屏幕不考虑继承:它们只是复制通常从 Customer 继承的“email”字段。

考虑到我此时的所有输入,如果我必须设计这些屏幕,我会提出以下方法。

1)CustomerEditFrame:带有电子邮件字段,未定义数据源

2) PersonEditScreen:
- Person 数据源
- 在 Person 数据源上映射 lastName 和 firstName 字段
- 嵌入 CustomerEditFrame
- 在 CustomerEditFrame 中注入 Person 数据源

3) CompanyEditScreen:
- 公司数据源
- 将行业字段映射到公司数据源
- 嵌入 CustomerEditFrame
- 在 CustomerEditFrame 中注入公司数据源

然后 CustomerEditFrame 负责编辑它在引用两个子类中的任何一个的数据源中知道的字段子集。这种设计能行吗?

为了文档的完整性,我认为这应该包含在示例中,因为这是常见的情况。此外,这将是帧操作的一个很好的样本。

4

1 回答 1

1

您绝对正确,屏幕应该考虑实体继承以消除代码重复。我在这里分叉了示例项目,以演示如何使用框架来完成它。

customer-frame.xml包含基本实体的字段和它的数据源:

<window xmlns="http://schemas.haulmont.com/cuba/window.xsd"
        caption="msg://editCaption"
        class="com.company.entityinheritance.gui.customer.CustomerFrame"
        focusComponent="fieldGroup"
        messagesPack="com.company.entityinheritance.gui.customer">
    <dsContext>
        <datasource id="customerDs"
                    class="com.company.entityinheritance.entity.Customer"
                    view="_local"/>
    </dsContext>
    <layout spacing="true">
        <fieldGroup id="fieldGroup"
                    datasource="customerDs">
            <column width="250px">
                <field id="name"/>
                <field id="email"/>
            </column>
        </fieldGroup>
    </layout>
</window>

CustomerFrame控制器中有一个公共方法来为数据源设置一个实例:

public class CustomerFrame extends AbstractFrame {

    @Inject
    private Datasource<Customer> customerDs;

    public void setCustomer(Customer customer) {
        customerDs.setItem(customer);
    }
}

公司编辑器company-edit.xml包括框架而不是客户字段:

<window xmlns="http://schemas.haulmont.com/cuba/window.xsd"
        caption="msg://editCaption"
        class="com.company.entityinheritance.gui.company.CompanyEdit"
        datasource="companyDs"
        focusComponent="customerFrame"
        messagesPack="com.company.entityinheritance.gui.company">
    <dsContext>
        <datasource id="companyDs"
                    class="com.company.entityinheritance.entity.Company"
                    view="_local"/>
    </dsContext>
    <layout expand="windowActions"
            spacing="true">
        <frame id="customerFrame"
               screen="demo$Customer.frame"/>
        <fieldGroup id="fieldGroup"
                    datasource="companyDs">
            <column width="250px">
                <field id="industry"/>
            </column>
        </fieldGroup>
        <frame id="windowActions"
               screen="editWindowActions"/>
    </layout>
</window>

在 Company 编辑器控制器中,框架被注入并且一个已编辑的实例被传递给它:

public class CompanyEdit extends AbstractEditor<Company> {

    @Inject
    private CustomerFrame customerFrame;

    @Override
    protected void postInit() {
        customerFrame.setCustomer(getItem());
    }
}
于 2016-09-01T10:43:49.877 回答