2016-08-29 17 views
2

提供サンプル「エンティティの継承は、」は、次のエンティティモデルを持っています
- カスタマー
- 当社は、お客様
を拡張 - 人お客様
を拡張 - 注文CUBA:エンティティ継承

OrderEdit画面がどのように処理するかを示して企業または個人である可能性のある顧客に関連するフィールドの継承。これは完全にはっきりしています。

ただし、CompanyとPersonの編集画面では、継承を考慮していません。一般にCustomerから継承された 'email'フィールドを複製するだけです。

私がこの時点で持っていたすべての入力を考えれば、これらのスクリーンを設計しなければならない場合は、次のように提案します。

1)CustomerEditFrame:電子メールフィールドと、全くデータソースは

2に定義されていない)PersonEditScreen:
- 個人データソース
- 個人データソース
にマップlastNameのフィールドとfirstNameフィールド - CustomerEditFrame
を埋め込む - 人を注入CustomerEditFrameのデータソース

3)CompanyEditScreen:
- 会社データソース
- 地図業界のフィールド会社データソース
へ - CustomerEditFrame
を埋め込む - CustomerEditFrame

に会社のデータソースを注入後CustomerEditFrameが、それは2つのサブクラスのいずれかを参照するデータソースに認識しているフィールドのサブセットを編集するための責任があります。このデザインは機能しますか?

ドキュメンテーションの完全性のために、私はこれがサンプルでカバーされるべきだと思います。さらに、フレーム操作のための良いサンプルになります。

答えて

1

コードの重複を排除するために画面にエンティティの継承を考慮する必要があります。サンプルプロジェクトhereをフォークして、フレームを使ってどのように処理できるかを実演しました。データソースにインスタンスを設定するためのパブリックメソッドがあるCustomerFrameコントローラで

<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> 

customer-frame.xmlは、ベースエンティティとのデータソースのフィールドが含ま

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> 
会社エディタコントローラで

は、フレームが注入され、編集されたインスタンスは、それに渡されます。

public class CompanyEdit extends AbstractEditor<Company> { 

    @Inject 
    private CustomerFrame customerFrame; 

    @Override 
    protected void postInit() { 
     customerFrame.setCustomer(getItem()); 
    } 
} 
+0

パーフェクト、あなたのコンスタンチンに感謝します。 – Mike