다음을 통해 공유


계산된 스토리지 속성 및 사용자 지정 스토리지 속성

DSL(도메인별 언어)의 모든 도메인 속성은 다이어그램과 언어 탐색기에서 사용자에게 표시할 수 있으며, 프로그램 코드로 액세스할 수도 있습니다. 그러나 속성은 저마다 값이 저장되는 방식이 다릅니다.

도메인 속성 종류

DSL 정의에서는 다음 표에 나열된 것처럼 도메인 속성의 종류를 설정할 수 있습니다.

도메인 속성 종류 설명
표준(기본값) 저장소에 저장되고 파일에 직렬화되는 도메인 속성입니다.
계산 저장소에 저장되지 않지만 다른 값에서 계산되는 읽기 전용 도메인 속성입니다. 예를 들어 Person.AgePerson.BirthDate를 이용해 계산할 수 있습니다. 계산을 수행하는 코드를 제공해야 합니다. 일반적으로 다른 도메인 속성의 값을 계산합니다. 하지만 외부 데이터를 사용할 수도 있습니다.
사용자 지정 스토리지 저장소에 직접 저장되지 않지만 get 및 set 둘 다 될 수 있는 도메인 속성입니다. 값을 얻고 설정하는 메서드를 제공해야 합니다. 예를 들어 Person.FullAddressPerson.StreetAddress, Person.CityPerson.PostalCode에 저장할 수 있습니다. 외부 리소스에 액세스할 수도 있습니다(예: 데이터베이스에서 값을 얻고 설정). Store.InUndoRedoOrRollback이 true인 경우 코드에서는 저장소에 값을 설정해서는 안 됩니다. 트랜잭션 및 사용자 지정 Setter를 참조하세요.

스토리지 속성에 대한 코드 제공

도메인 속성의 종류를 계산 또는 사용자 지정 스토리지로 설정했다면 액세스 방법을 제공해야 합니다. 솔루션을 빌드할 때는 필요한 내용이 오류 보고서에 표시됩니다.

계산 또는 사용자 지정 스토리지 속성을 정의하려면

  1. DslDefinition.dsl의 다이어그램이나 DSL 탐색기에서 도메인 속성을 선택합니다.

  2. 속성 창에서 종류 필드를 계산 또는 사용자 지정 스토리지로 설정합니다.

    형식을 원하는 형식으로 설정했는지도 확인합니다.

  3. 솔루션 탐색기의 도구 모음에서 모든 템플릿 변환을 선택합니다.

  4. 빌드 메뉴에서 솔루션 빌드를 선택합니다.

    "<YourClass>에 Get<YourProperty>의 정의가 없습니다."라는 오류 메시지가 표시됩니다.

  5. 오류 메시지를 두 번 클릭합니다.

    Dsl\GeneratedCode\DomainClasses.cs 또는 DomainRelationships.cs가 열립니다. 강조 표시된 메서드 호출 위에 있는 주석에서 Get<YourProperty>()의 구현을 제공하라는 메시지가 표시됩니다.

    참고 항목

    이 파일은 DslDefinition.dsl에서 생성됩니다. 이 파일을 편집한 경우 다음에 모든 템플릿 변환을 선택하면 변경 내용이 손실됩니다. 대신 필요한 메서드를 별도의 파일에 추가해야 합니다.

  6. 별도의 폴더(예: CustomCode\<YourDomainClass>.cs)에서 클래스 파일을 만들거나 엽니다.

    네임스페이스가 생성된 코드에서도 동일한지 확인합니다.

  7. 클래스 파일에서 도메인 클래스의 부분 구현을 작성합니다. 클래스에서 다음 예제와 유사한, 누락된 Get 메서드에 대한 정의를 작성합니다.

    namespace Company.FamilyTree
    {  
      public partial class Person
      {
        int GetAgeValue()
        {
          return System.DateTime.Today.Year - this.BirthYear;
        }
      }
    }
    
  8. 종류사용자 지정 스토리지로 설정하면 Set 메서드도 제공해야 합니다. 예시:

    void SetAgeValue(int value)
    {
      if (!Store.InUndoRedoOrRollback) this.BirthYear = System.DateTime.Today.Year - value;
    }
    

    Store.InUndoRedoOrRollback이 true인 경우 코드에서는 저장소에 값을 설정해서는 안 됩니다. 트랜잭션 및 사용자 지정 Setter를 참조하세요.

  9. 솔루션을 빌드하고 실행합니다.

  10. 속성을 테스트합니다. 실행 취소다시 실행을 시도해야 합니다.

트랜잭션 및 사용자 지정 Setter

사용자 지정 스토리지 속성의 set 메서드에서는 트랜잭션을 열 필요가 없습니다. 이 메서드는 일반적으로 활성 트랜잭션 내에서 호출됩니다.

그러나 사용자가 실행 취소 또는 다시 실행을 호출하거나 트랜잭션이 롤백되는 경우에도 set 메서드를 호출할 수 있습니다. InUndoRedoOrRollback이 true면 set 메서드는 다음과 같이 동작해야 합니다.

  • 다른 도메인 속성에 값을 할당하는 것과 같은 저장소 변경 작업을 수행해선 안 됩니다. 실행 취소 관리자는 자체 값을 설정합니다.

  • 그러나 데이터베이스 또는 파일 내용 같은 외부 리소스나 저장소 외부의 개체는 업데이트해야 합니다. 이렇게 하면 저장소에 있는 값과의 동기화가 유지됩니다.

    예시:

    void SetAgeValue(int value)
    {
      // If we are in Undo, no changes to Store objects:
      if (!this.Store.InUndoRedoOrRollback)
      {
        this.BirthYear = System.DateTime.Today.Year - value;
      }
      // But always update external objects:
      System.IO.File.WriteAllText(AgeFile, value);
    }
    

트랜잭션에 대한 자세한 내용은 프로그램 코드에서 모델 탐색 및 업데이트를 참조하세요.