Przejdź do głównej zawartości

Język C#


Język C# jako metoda SDO wybierany jest dla specyficznych zastosowań w metodach przetwarzania, których specyfika nie odpowiada wyborowi innej metody. Agregaty te tworzymy jako elementy property publicznej klasy.

Aby dana klasa mogła posłużyć jako zbiór agregatów musi spełnić następujące wymagania:

  1. musi być publiczna, nie może być statyczna ani abstrakcyjna,
  2. nie może mieć modyfikatora sealed,
  3. musi mieć modyfikator partial (przyczyna tego wymagania opisana poniżej),
  4. przestrzeń nazw (namespace) musi mieć postać: <<nazwa przestrzeni>>.<<Ścieżka wejściowa/ wyjściowa>>

Podobnie jak klasa, elementy property musi spełnić następujące wymagania:

  1. musi być typem akceptowalnym przez SDO, czyli:
  • String,
  • DateTime,
  • Decimal,
  • Double,
  • Guid,
  • Boolean,
  1. musi mieć modyfikator virtual,
  2. nie może posiadać klauzuli set,
  3. musi posiadać klauzulę get,
  4. musi być publiczny (modyfikator public).

Wszystkie property spełniające warunki opisane powyżej są dodawane jako agregaty do ścieżki wyjściowej i mogą być używane przez inne agregaty.

W celu stworzenia SDO w języku C#:

  1. W oknie głównym wybierz ikonę dodawania w lewym górnym rogu lub z menu głównego Plik>Nowy lub z menu kontekstowego serwera wersji Nowy element.
  2. Następnie w oknie popup wybierz SDO. Jako Typ transformacji wybierz Kod C# i kliknij OK.

image

  1. Po wybraniu powyższego wyświetlana jest zakładka umożliwiająca tworzenie kodu gdzie w komentarzach znajdują się podpowiedzi gdzie kod przekształcenia powinien się znaleźć.
  2. Pierwszym krokiem jest wybór Przestrzeni danych. Należy pamiętać aby dodatkowo odpowiednio zmodyfikować również namespace w kodzie. Przestrzeń danych w górnym oknie wyboru musi być identyczna z tą w kodzie.

image

W poniższym przypadku w polu Ścieżka wyjściowa została wybrana Przestrzeń danych, która jest podrzędna w stosunku do ścieżki w polu Ścieżka wejściowa, co jest poprawne z punktu widzenia dostępu do drzewiastej struktury danych. W tym przypadku system zgłasza jedynie błędy walidacji dotyczące poprawnego umieszczenia kodu w namespace, które powinno być skonfigurowane w następujący sposób:

namespace: KlienciTransakcje.Rachunek.TRANSAKCJE;

image

Odwrotna sytuacja nie jest poprawna i zostanie wyświetlony błąd.

image

Dodatkowo, kod tworzony kod C# może korzystać z wszystkich agregatów dostępnych w ścieżce wejściowej/wyjściowej – można się do nich odwołać przez klauzulę this. Agregaty te są częścią definicji edytowanej klasy, jednak aby nie wprowadzać dodatkowego utrudnienia nie są one widoczne w kodzie agregatów użytkownika (jest to powód, dla którego wymagana jest klauzula partial dla każdej klasy, która ma zawierać agregaty – wszystkie istniejące agregaty są generowane w tej niewidocznej dla użytkownika części klasy). Kod definiujący agregat może też odwoływać się nie tylko do bieżącej ścieżki, ale także do pozostałych agregatów i elementów drzewa przestrzeni danych. Klasa poprzez klauzulę this ma także dostęp do elementów podrzędnych, oraz do elementu „rodzica” – aby się do niego odwołać należy użyć własności Parent

Wymagalność​

Każdy agregat w swojej deklaracji musi opisać, czy jest wymagalny, czyli czy zwróconą przez niego wartością może być null. Typy zwracane przez agregaty możemy podzielić na dwie grupy: typy referencyjne, do których należy typ System.String oraz struktury do których należą wszystkie pozostałe typy.

W przypadku struktur, domyślnie nie są one w stanie zwrócić wartości null, co oznacza, że są traktowane jako wymagalne. Aby agregat, który jest strukturą mógł być traktowany jako niewymagalny, należy go zadeklarować jako typ nullable, czyli używając typu generycznego Nullable<T> lub skrótu ?:

public virtual decimal? NiewymagalnePole
{
get {return 0:}
}
public virtual Nullable<decimal> NiewymagalnePole2
{
get {return -1:}
}

image

W przypadku typu System.String, będącego referencją, sprawa wygląda inaczej: mimo iż, jest to typ referencyjny i może przyjąć wartość null, domyślnie zakładamy, że agregat jest wymagalny, czyli property nie może zwrócić wartości null (zwrócenie null spowoduje błąd w obliczaniu agregatów). Jeśli chcemy, aby agregat był niewymagalny, należy do property dodać atrybut CanBeNull:

/// <summary> Agregat wymagalny - nie może zwrócić wartości <c>null</c>. </summary>
public virtual String AgregatWymagalny
{
get {return "";}
}
/// <summary> Agregat niewymagalny - może zwrócić wartość <c>null</c>. </summary>
[CanBeNull]
public virtual String AgregatWymagalny
{
get {return null;}
}

image

Zależności od innych agregatów​

SDO wymaga, aby na etapie projektowania znane były wszystkie zależności, czyli inaczej mówiąc wszystkie agregaty potrzebne do wyliczenia projektowanego agregatu. Odpowiednia analiza jest wykonywana na etapie projektowania, a podczas wykonywania silnik uruchamiający wyliczanie agregatów dba o to, aby można było się odwołać tylko do elementów zależnych, które zostały wcześniej zadeklarowane/obliczone.

Domyślnie, analizator języka C# jest w stanie obliczyć wszystkie agregaty zależne, dlatego też nie ma potrzeby ręcznego opisywania wejścia.

Mogą pojawić się jednak sytuacje, kiedy analizator nie będzie w stanie sam rozwiązać potrzebnych zależności (np. gdy zostanie użyty mechanizm refleksji). Należy wtedy taki agregat oznaczyć atrybutem DependsOn

[DependsOn("CA_FV_1_6")]
public virtual decimal AgregatZRefleksja
{
get
{
var propertyInfo = this.GetType().GetProperty("CA_FV_1_6");
decimal value - (decimal)propertyInfo.GetValue(this);
return value * 2;
}
}

image

Zobacz również​

Grupa SDO

Analizator zależności

Przykłady użycia