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:
Prześlij komentarz