Udostępnij za pośrednictwem


Obliczane i niestandardowe właściwości magazynu

Wszystkie właściwości domeny w języku specyficznym dla domeny (DSL) mogą być wyświetlane użytkownikowi na diagramie i w Eksploratorze języka i mogą być dostępne za pomocą kodu programu. Jednak właściwości różnią się sposobem przechowywania ich wartości.

Rodzaje właściwości domeny

W definicji DSL można ustawić rodzaj właściwości domeny, jak pokazano w poniższej tabeli:

Rodzaj właściwości domeny opis
Standardowa (wartość domyślna) Właściwość domeny zapisana w magazynie i serializowana do pliku.
Obliczana Właściwość domeny tylko do odczytu, która nie jest zapisywana w magazynie, ale jest obliczana na podstawie innych wartości. Na przykład Person.Age można obliczyć z Person.BirthDate. Musisz podać kod, który wykonuje obliczenia. Zazwyczaj oblicza się wartość z innych właściwości domeny. Można jednak również używać zasobów zewnętrznych.
Magazyn niestandardowy Właściwość domeny, która nie jest zapisywana bezpośrednio w magazynie, ale może być zarówno pobierana, jak i ustawiana. Musisz podać metody, które pobierają i ustawiają wartość. Na przykład Person.FullAddress można przechowywać w Person.StreetAddressplikach , Person.Cityi Person.PostalCode. Możesz również uzyskać dostęp do zasobów zewnętrznych, na przykład w celu pobrania i ustawienia wartości z bazy danych. Kod nie powinien ustawiać wartości w magazynie, gdy Store.InUndoRedoOrRollback ma wartość true. Zobacz Transakcje i niestandardowe moduły ustawiania.

Podawanie kodu dla właściwości magazynu

Jeśli ustawisz rodzaj właściwości domeny na obliczanie lub magazyn niestandardowy, musisz zapewnić metody dostępu. Podczas tworzenia rozwiązania raport o błędach informuje o tym, co jest wymagane.

Aby zdefiniować właściwość obliczeniową lub niestandardową magazynu

  1. W pliku DslDefinition.dsl wybierz właściwość domeny na diagramie lub w Eksploratorze DSL.

  2. W oknie Właściwości ustaw pole Rodzaj na Wartość obliczeniowa lub Magazyn niestandardowy.

    Upewnij się, że ustawiono również jego typ na odpowiedni typ.

  3. Wybierz pozycję Przekształć wszystkie szablony na pasku narzędzi Eksplorator rozwiązań.

  4. W menu Kompilacja wybierz pozycję Kompiluj rozwiązanie.

    Zostanie wyświetlony następujący komunikat o błędzie: "<TwojaClass> nie zawiera definicji właściwości Get<YourProperty>".

  5. Kliknij dwukrotnie komunikat o błędzie.

    Plik Dsl\GeneratedCode\DomainClasses.cs lub DomainRelationships.cs zostanie otwarty. Powyżej wyróżnionego wywołania metody komentarz monituje o podanie implementacji metody Get<YourProperty>().

    Uwaga

    Ten plik jest generowany na podstawie pliku DslDefinition.dsl. Jeśli edytujesz ten plik, zmiany zostaną utracone przy następnym wybraniu pozycji Przekształć wszystkie szablony. Zamiast tego dodaj wymaganą metodę w osobnym pliku.

  6. Utwórz lub otwórz plik klasy w osobnym folderze, na przykład CustomCode\<YourDomainClass.cs>.

    Upewnij się, że przestrzeń nazw jest taka sama jak w wygenerowany kod.

  7. W pliku klasy napisz częściową implementację klasy domeny. W klasie napisz definicję brakującej Get metody, która przypomina następujący przykład:

    namespace Company.FamilyTree
    {  
      public partial class Person
      {
        int GetAgeValue()
        {
          return System.DateTime.Today.Year - this.BirthYear;
        }
      }
    }
    
  8. Jeśli ustawisz opcję Rodzaj na Magazyn niestandardowy, musisz również podać metodę Set . Na przykład:

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

    Kod nie powinien ustawiać wartości w magazynie, gdy Store.InUndoRedoOrRollback ma wartość true. Zobacz Transakcje i niestandardowe moduły ustawiania.

  9. Skompiluj i uruchom rozwiązanie.

  10. Przetestuj właściwość . Upewnij się, że spróbujesz cofnąć i ponownie wykonać.

Transakcje i niestandardowe moduły ustawiania

W metodzie set właściwości Custom Storage nie trzeba otwierać transakcji. Metoda jest zwykle wywoływana wewnątrz aktywnej transakcji.

Jednak metoda może być również wywoływana, set jeśli użytkownik wywołuje Cofnij lub Wykonaj ponownie, lub jeśli transakcja jest cofana. Jeśli InUndoRedoOrRollback wartość ma wartość true, metoda set powinna zachowywać się w następujący sposób:

  • Nie należy wprowadzać zmian w magazynie, takich jak przypisywanie wartości do innych właściwości domeny. Menedżer cofania ustawia ich wartości.

  • Należy jednak zaktualizować wszystkie zasoby zewnętrzne, takie jak baza danych lub zawartość pliku, lub obiekty poza magazynem. Takie podejście zapewnia, że są one synchronizowane z wartościami w magazynie.

    Na przykład:

    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);
    }
    

Aby uzyskać więcej informacji na temat transakcji, zobacz Nawigowanie i aktualizowanie modelu w kodzie programu.