다음을 통해 공유


생성된 클래스 재정의 및 확장

DSL 정의는 도메인별 언어를 기반으로 하는 강력한 도구 집합을 빌드할 수 있는 플랫폼입니다. DSL 정의에서 생성된 클래스를 재정의하고 확장하여 많은 확장 및 적응을 수행할 수 있습니다. 이러한 클래스에는 DSL 정의 다이어그램에서 명시적으로 정의한 도메인 클래스뿐만 아니라 도구 상자, 탐색기, serialization 등을 정의하는 다른 클래스도 포함됩니다.

확장성 메커니즘

생성된 코드를 확장할 수 있도록 몇 가지 메커니즘이 제공됩니다.

부분 클래스의 메서드 재정의

부분 클래스 정의를 사용하면 둘 이상의 위치에서 클래스를 정의할 수 있습니다. 이렇게 하면 생성된 코드를 직접 작성하는 코드와 분리할 수 있습니다. 수동으로 작성된 코드에서 생성된 코드에서 상속된 클래스를 재정의할 수 있습니다.

예를 들어 DSL 정의에서 이름이 지정된 Book도메인 클래스를 정의하는 경우 재정의 메서드를 추가하는 사용자 지정 코드를 작성할 수 있습니다.

public partial class Book
{
   protected override void OnDeleting()
   {
      MessageBox.Show("Deleting book " + this.Title);
      base.OnDeleting();
   }
}

비고

생성된 클래스의 메서드를 재정의하려면 항상 생성된 파일과 분리된 파일에 코드를 작성합니다. 일반적으로 파일은 CustomCode라는 폴더에 포함됩니다. 생성된 코드를 변경하면 DSL 정의에서 코드를 다시 생성하면 해당 코드가 손실됩니다.

재정의할 수 있는 메서드를 찾으려면 클래스 내에서 override를 입력한 다음 띄어쓰기를 입력합니다. IntelliSense 툴팁은 재정의할 수 있는 메서드를 알려줍니다.

이중 파생 클래스

생성된 클래스의 대부분의 메서드는 모델링 네임스페이스의 고정된 클래스 집합에서 상속됩니다. 그러나 일부 메서드는 생성된 코드에 정의됩니다. 일반적으로 이는 재정의할 수 없음을 의미합니다. 한 partial 클래스에서 동일한 클래스의 다른 부분 정의에 정의된 메서드를 재정의할 수 없습니다.

그럼에도 불구하고 도메인 클래스에 대해 Generates Double Derived 플래그를 설정하여 이러한 메서드를 재정의할 수 있습니다. 이렇게 하면 두 클래스가 생성되며, 하나는 다른 클래스의 추상 기본 클래스입니다. 모든 메서드 및 속성 정의는 기본 클래스에 있으며 생성자만 파생 클래스에 있습니다.

예를 들어 샘플 Library.dsl CirculationBook에서 도메인 클래스의 속성은 Generates``Double Derivedtrue에 설정됩니다. 해당 도메인 클래스에 대해 생성된 코드에는 다음 두 개의 클래스가 포함됩니다.

  • CirculationBookBase추상이며 모든 메서드와 속성을 포함하는 입니다.

  • CirculationBookBase에서 CirculationBook가 파생됩니다. 생성자를 제외하고 비어 있습니다.

메서드를 재정의하려면 파생 클래스의 부분 정의(예: CirculationBook.)를 만듭니다. 생성된 메서드와 모델링 프레임워크에서 상속된 메서드를 모두 재정의할 수 있습니다.

모델 요소, 관계, 셰이프, 다이어그램 및 연결선 등 모든 유형의 요소에서 이 메서드를 사용할 수 있습니다. 생성된 다른 클래스의 메서드를 재정의할 수도 있습니다. ToolboxHelper와 같은 일부 생성된 클래스는 항상 이중 파생됩니다.

사용자 지정 생성자

생성자를 재정의할 수 없습니다. 이중 파생 클래스에서도 생성자는 파생 클래스에 있어야 합니다.

고유한 생성자를 제공하려는 경우 DSL 정의에서 도메인 클래스에 대해 설정 Has Custom Constructor 하여 이 작업을 수행할 수 있습니다. 모든 템플릿 변환을 클릭하면 생성된 코드에 해당 클래스의 생성자가 포함되지 않습니다. 여기에는 누락된 생성자에 대한 호출이 포함됩니다. 이렇게 하면 솔루션을 빌드할 때 오류 보고서가 발생합니다. 오류 보고서를 두 번 클릭하여 제공해야 하는 내용을 설명하는 주석을 생성된 코드에 표시합니다.

생성된 파일과 별개의 파일에 부분 클래스 정의를 작성하고 생성자를 제공합니다.

플래그가 지정된 확장 지점

플래그가 지정된 확장 지점은 사용자 지정 메서드를 제공할 것임을 나타내는 속성 또는 확인란을 설정할 수 있는 DSL 정의의 위치입니다. 사용자 지정 생성자는 한 가지 예입니다. 다른 예로는 도메인 속성을 계산 또는 사용자 지정 스토리지로 설정 Kind 하거나 연결 작성기에서 Is Custom 플래그를 설정하는 것이 포함됩니다.

각 경우에 플래그를 설정하고 코드를 다시 생성하면 빌드 오류가 발생합니다. 오류를 두 번 클릭하면 제공해야 할 내용을 설명하는 댓글을 볼 수 있습니다.

규칙

트랜잭션 관리자를 사용하면 속성 변경과 같이 지정된 이벤트가 발생한 트랜잭션이 끝나기 전에 실행되는 규칙을 정의할 수 있습니다. 규칙은 일반적으로 저장소의 여러 요소 간에 동기화를 유지하는 데 사용됩니다. 예를 들어 규칙을 사용하여 다이어그램에 모델의 현재 상태가 표시되는지 확인합니다.

규칙은 각 개체에 대한 규칙을 등록하는 코드를 가질 필요가 없도록 클래스별로 정의됩니다. 자세한 내용은 모델 내의 변경 내용을 전파하는 규칙을 참조하세요.

이벤트 저장

모델링 저장소는 요소 추가 및 삭제, 속성 값 변경 등을 포함하여 저장소의 특정 유형의 변경 내용을 수신 대기하는 데 사용할 수 있는 이벤트 메커니즘을 제공합니다. 이벤트 처리기는 변경된 트랜잭션이 종료된 후에 호출됩니다. 일반적으로 이러한 이벤트는 저장소 외부의 리소스를 업데이트하는 데 사용됩니다.

.NET 이벤트

셰이프에서 일부 이벤트를 구독할 수 있습니다. 예를 들어 셰이프에서 마우스 클릭을 수신 대기할 수 있습니다. 각 개체에 대한 이벤트를 구독하는 코드를 작성해야 합니다. 이 코드는 InitializeInstanceResources()의 재정의로 작성할 수 있습니다.

일부 이벤트는 셰이프 필드에 생성되며 셰이프에 데코레이터를 그리는 데 사용됩니다. 예를 들어 방법: 셰이프 또는 데코레이터에서 클릭을 가로채는 방법을 참조하세요.

이러한 이벤트는 일반적으로 트랜잭션 내에서 발생하지 않습니다. 스토어를 변경하려면 트랜잭션을 만들어야 합니다.