2016-08-29 4 views
2

샘플 '법인 상속'제공 다음 개체 모델이 있습니다
- 고객
- 회사는 확장 고객
- 어떻게 처리하기 위해쿠바 : 개체 상속

OrderEdit 화면 쇼 - 사람은 고객
를 확장 회사 또는 사람이 될 수있는 고객과 관련된 필드에 대한 상속. 이것은 아주 분명합니다.

그러나 Company 및 Person의 편집 화면에서는 상속을 고려하지 않으므로 단순히 고객이 상속하는 '전자 메일'필드를 복제하기 만하면됩니다.

이 모든 입력을 감안할 때 이러한 스크린을 설계해야한다면 다음과 같은 방법을 제안 할 것입니다.

1) CustomerEditFrame : 이메일 필드, 어떤 데이터 소스가

2) PersonEditScreen 정의되지 :
- 사람의 데이터 소스
- 사람의 데이터 소스에 맵이 lastName 필드와 firstName 필드
을 - CustomerEditFrame
포함 - 사람을 주입 CustomerEditFrame에서 데이터 소스

3) CompanyEditScreen :
- 회사 데이터 소스
- 회사 데이터 소스
에 맵 산업 분야 일 - CustomerEditFrame

그런 다음 CustomerEditFrame이 필드의 하위 집합을 편집에 대한 책임은 두 개의 서브 클래스 중 하나를 참조하는 데이터 소스에의 인식에서 회사 데이터 소스를 주입 - CustomerEditFrame
을 포함 . 이 디자인이 효과가 있습니까?

설명서의 완성을 위해 일반적인 사례이므로이 내용은 예제로 다루어야한다고 생각합니다. 또한 프레임 조작을위한 좋은 샘플이 될 것입니다.

답변

1

코드 중복을 제거하기 위해 화면에서 엔티티 상속을 고려해야한다는 것은 당연한 것입니다. 프레임을 사용하여 어떻게 수행 할 수 있는지 보여주기 위해 샘플 프로젝트 here을 포크했습니다.

public class CustomerFrame extends AbstractFrame { 

    @Inject 
    private Datasource<Customer> customerDs; 

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

회사 : 데이터 소스에 인스턴스를 설정하는 공용 방법 거기 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베이스 객체 필드 및 그것을위한 데이터 소스를 포함 편집기 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