poniedziałek, 9 lipca 2007

Używanie DataSetów globalnych

Czasami w wielu miejscach aplikacji używane są te same dane, przykładem mogą być słowniki, czy też listy klientów. Jeśli danych w tychże tabelach jest stosunkowo niewiele, a dodatkowo dane te są rzadko modyfikowane, to warto pokusić się o przechowywanie w pamięci wszystkich rekordów w takiej postaci by były one dostępne dla wszystkich komponentów aplikacji.

Sigletony - tak, ale nie do końca... Czasami jednak istnieje potrzeba pozostawienia możliwości utworzenia nowej instancji - przykład: DataSet zawierający dane klientów. Dane klientów pochodzą z zewnętrznego systemu, jednak w prawie wszystkich polach wyboru w aplikacji interesuje nas tylko pewna wybrana grupa klientów, natomiast w kontrolce służącej do wyboru klientów z systemu zewnętrznego kryteria wyboru mogą być zupełnie inne.

Stąd koncepcja globalnej instancji, która jest zwracana przez DataSet. Przykład:

    public partial class DictionariesDataSet
{
private static DictionariesDataSet globalInstance;

public static DictionariesDataSet GlobalInstance
{
get
{
if (globalInstance == null)
{
globalInstance = new DictionariesDataSet();
}
return globalInstance;
}
}
}

Jak widać umieściłem ten kod w kodzie używanego datasetu, stąd też użycie takiego globalnego obiektu jest dość intuicyjne, przykład:

this.dictionariesDataSet = DictionariesDataSet.GlobalInstance;

Wadą rozwiązania jest to, że w osobnym miejscu trzeba załadować wszystkie globalne datasety, ale nie chciałem rezygnować z wykorzystywanego od dłuższego czasu wydzielenia kodu DAL i typowanych DataSetów do osobnych bibliotek. I o ile dopuszczam, że DAL może wiedzieć o konkretnych DataSetach, do których ładuje dane, to nie chciałbym wprowadzać odwrotnej zależności, czyli udostępniania komponentowi z DataSetami wiedzy (i referencji) o konkretnym DAL. Z kolei zastanawiałem się nad umieszczeniem powyższego singletonu na poziomie DAL, ale też nie mogłem się przekonać do tego pomysłu.

0 komentarze: