이 섹션에서는 사용자 지정 코드를 사용하여 DSL(도메인별 언어)에서 모델에 액세스, 수정 또는 만드는 방법을 보여 줍니다.
DSL에 대한 코드 작성 컨텍스트
DSL에서 작동하는 코드를 작성할 수 있는 몇 가지 컨텍스트가 있습니다.
사용자 지정 명령. 사용자가 다이어그램을 마우스 오른쪽 단추로 클릭하여 호출할 수 있고 모델을 수정할 수 있는 명령을 만들 수 있습니다. 자세한 내용은 방법: 바로 가기 메뉴에 명령 추가를 참조하세요.
유효성 검사. 모델이 올바른 상태인지 확인하는 코드를 작성할 수 있습니다. 자세한 내용은 Domain-Specific 언어의 유효성 검사를 참조하세요.
기본 동작 재정의 DslDefinition.dsl에서 생성된 코드의 여러 측면을 수정할 수 있습니다. 자세한 내용은 생성된 클래스 재정의 및 확장을 참조하세요.
텍스트 변환. 예를 들어 모델에 액세스하고 텍스트 파일을 생성하는 코드가 포함된 텍스트 템플릿을 작성하여 프로그램 코드를 생성할 수 있습니다. 자세한 내용은 Domain-Specific 언어에서 코드 생성을 참조하세요.
기타 Visual Studio 확장. 모델을 읽고 수정하는 별도의 VSIX 확장을 작성할 수 있습니다. 자세한 내용은 방법: 프로그램 코드의 파일에서 모델 열기
In-Memory 스토어
DslDefinition.dsl에서 정의하는 클래스의 인스턴스는 IMS(In-Memory Store) 또는 Store라는 데이터 구조에 유지됩니다. DSL에서 정의하는 클래스는 항상 Store를 생성자에 대한 인수로 사용합니다. 예를 들어 DSL이 다음과 같은 Example클래스를 정의하는 경우
Example element = new Example (theStore);
일반 개체로 유지하는 대신 Store에 개체를 보관하면 여러 가지 이점이 있습니다.
트랜잭션. 일련의 관련 변경 내용을 트랜잭션으로 그룹화할 수 있습니다.
using (Transaction t = store.TransactionManager.BeginTransaction("updates")) { // make several changes to Store elements here t.Commit(); }최종
Commit()작업이 수행되지 않도록 변경 중에 예외가 발생하면 스토어가 이전 상태로 다시 설정됩니다. 이 방법을 사용하면 오류가 모델을 일관되지 않은 상태로 유지하지 않도록 하는 데 도움이 됩니다. 자세한 내용은 프로그램 코드에서 모델 탐색 및 업데이트를 참조하세요.이진 관계입니다. 두 클래스 간의 관계를 정의하는 경우 양쪽 끝의 인스턴스에는 다른 쪽 끝으로 이동하는 속성이 있습니다. 두 끝은 항상 동기화됩니다. 예를 들어 부모 및 자식 역할과 부모 관계를 정의하는 경우 다음을 작성할 수 있습니다.
John.Children.Add(Mary)이제 다음 두 식이 모두 참입니다.
John.Children.Contains(Mary)Mary.Parents.Contains(John)다음을 작성하여 동일한 효과를 얻을 수도 있습니다.
Mary.Parents.Add(John)자세한 내용은 프로그램 코드에서 모델 탐색 및 업데이트를 참조하세요.
규칙 및 이벤트. 지정된 변경이 있을 때마다 적용되는 규칙을 정의할 수 있습니다. 예를 들어 다이어그램의 셰이프를 현재 모델 요소로 최신 상태로 유지하기 위해 규칙이 사용됩니다. 자세한 내용은 변경 사항에 대응하고 전파하는 방법을 참조하세요.
직렬화. 스토어는 포함된 개체를 파일에 직렬화하는 표준 방법을 제공합니다. 직렬화 및 역직렬화에 대한 규칙을 사용자 지정할 수 있습니다. 자세한 내용은 파일 스토리지 및 XML Serialization 사용자 지정을 참조하세요.