생성된 클래스 재정의 및 확장
DSL 정의는 도메인 특정 언어를 기반으로 하는 강력한 도구 집합을 빌드할 수 있는 플랫폼입니다. DSL 정의에서 생성된 클래스를 재정의하고 확장하여 많은 확장과 적응을 만들 수 있습니다. 이러한 클래스에는 DSL 정의 다이어그램에서 명시적으로 정의한 도메인 클래스뿐 아니라 도구 상자, 탐색기, serialization 등을 정의하는 기타 클래스도 포함됩니다.
확장성 메커니즘
생성된 코드를 확장할 수 있는 몇 가지 메커니즘이 제공됩니다.
partial 클래스의 메서드 재정의
partial 클래스 정의를 사용하면 둘 이상의 위치에서 클래스를 정의할 수 있습니다. 이렇게 하면 생성된 코드를 직접 작성하는 코드와 분리할 수 있습니다. 수동으로 작성한 코드에서 생성된 코드가 상속하는 클래스를 재정의할 수 있습니다.
예를 들어 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 Derived
속성은 true
로 설정되어 있습니다. 이 도메인 클래스에 대해 생성된 코드에는 다음 두 개의 클래스가 포함됩니다.
CirculationBookBase
는 추상이며, 모든 메서드와 속성을 포함합니다.CirculationBook
은CirculationBookBase
에서 파생됩니다. 생성자를 제외하고는 비어 있습니다.
메서드를 재정의하려면 CirculationBook
과 같은 파생 클래스의 부분 정의를 만듭니다. 생성된 메서드와 모델링 프레임워크에서 상속된 메서드를 모두 재정의할 수 있습니다.
모델 요소, 관계, 도형, 다이어그램 및 연결선을 비롯한 모든 형식의 요소에 이 메서드를 사용할 수 있습니다. 생성된 다른 클래스의 메서드도 재정의할 수 있습니다. ToolboxHelper와 같은 일부 생성된 클래스는 항상 이중 파생됩니다.
사용자 지정 생성자
생성자는 재정의할 수 없습니다. 이중 파생 클래스에서도 생성자는 파생 클래스에 있어야 합니다.
자체 생성자를 제공하려는 경우 DSL 정의에서 도메인 클래스에 Has Custom Constructor
를 설정하여 이 작업을 수행할 수 있습니다. 모든 템플릿 변환을 클릭하면 생성된 코드에 해당 클래스의 생성자가 포함되지 않습니다. 누락된 생성자에 대한 호출이 포함됩니다. 이로 인해 솔루션을 빌드할 때 오류 보고서가 생성됩니다. 생성된 코드에서 제공해야 하는 항목을 설명하는 주석을 보려면 오류 보고서를 두 번 클릭하세요.
생성된 파일과 별도의 파일에 partial 클래스 정의를 작성하고 생성자를 제공합니다.
플래그 지정된 확장 지점
플래그 지정된 확장 지점은 사용자 지정 메서드를 제공할 것임을 나타내는 속성 또는 확인란을 설정할 수 있는 DSL 정의 내 위치입니다. 사용자 지정 생성자가 한 가지 예입니다. 다른 예로는 도메인 속성의 Kind
를 Calculated 또는 Custom Storage로 설정하거나 연결 작성기에서 Is Custom 플래그를 설정하는 것 등이 있습니다.
각각의 경우 플래그를 설정하고 코드를 다시 생성하면 빌드 오류가 발생합니다. 제공해야 하는 항목을 설명하는 주석을 보려면 오류를 두 번 클릭하세요.
규칙
트랜잭션 관리자를 사용하면 속성의 변경과 같이 지정된 이벤트가 발생한 트랜잭션의 끝 전에 실행되는 규칙을 정의할 수 있습니다. 규칙은 일반적으로 저장소에 있는 서로 다른 요소 간에 동기성을 유지하는 데 사용됩니다. 예를 들어 규칙을 사용하여 다이어그램에 모델의 현재 상태가 표시되도록 합니다.
규칙은 클래스별로 정의되므로 각 개체의 규칙을 등록하는 코드가 없어도 됩니다. 자세한 내용은 규칙으로 모델 내에서 변경 내용 전파를 참조하세요.
이벤트 저장
모델링 저장소는 요소의 추가 및 삭제와 속성 값의 변경 등을 비롯하여 저장소의 특정 변경 유형을 수신 대기하는 데 사용할 수 있는 이벤트 메커니즘을 제공합니다. 이벤트 처리기는 변경이 수행된 트랜잭션이 닫힌 후에 호출됩니다. 일반적으로 이러한 이벤트는 저장소 외부의 리소스를 업데이트하는 데 사용됩니다.
.NET 이벤트
도형에 대한 일부 이벤트를 구독할 수 있습니다. 예를 들어 도형에서 마우스 클릭을 수신 대기할 수 있습니다. 각 개체마다 이벤트를 구독하는 코드를 작성해야 합니다. 이 코드는 InitializeInstanceResources()의 재정의에서 작성될 수 있습니다.
ShapeFields에서 생성되는 일부 이벤트는 도형에 데코레이터를 그리는 데 사용됩니다. 예를 들어 방법: 모양 또는 데코레이터 클릭 가로채기를 참조하세요.
이러한 이벤트는 일반적으로 트랜잭션 내에서 발생하지 않습니다. 저장소에서 변경을 수행하려면 트랜잭션을 만들어야 합니다.