Имайте някои налични стойности, преди да получите достъп до сингълтон за първи път или как да инициализирате обект в сингълтън

Това е текущият ми сингълтън:

public sealed class DataCollection
{
    // creating singleton instance (http://csharpindepth.com/Articles/General/Singleton.aspx)
    private static readonly Lazy<DataCollection> lazy = new Lazy<DataCollection>(() => new DataCollection());

    public User currentUser { get; set; }

    public Filter currentFilter { get; set; }

    // fully laziness
    public static DataCollection Instance {
        get{
            return lazy.Value;
        }
    }

    private DataCollection ()
    {
    }
}

В моя Filter обект имам следното:

public class Filter
{
    public bool newEntries { get; set; }
    public List<PerfLoc> costCentres { get; set; }

    public Filter ()
    {
        newEntries = false;
        costCentres = new List<PerfLoc> ();
        read ();
    }

    public void read(){
        // do some initialization here (e.g. read some stored values in)
    }
}

Сега искам да получа достъп до Filter така:

globalData = DataCollection.Instance;
bool new = globalData.currentFilter.newEntries;

Но тук обектът Filter не е инициализиран и следователно е нулев. Бих могъл да създам нов филтърен обект и да го настроя и след това да осъществя достъп до него, но би било най-добре инициализирането да се извърши в екземпляра Singleton.

Така че си помислих за инициализация като тази:

private DataCollection ()
{
    currentFilter = new Filter();
}

Това ли е правилният начин, без да се прави компромис с единичен модел? Трябва да има налична стойност преди достъп до Filter за първи път. По-късно реших да създам нов Filter обект и да го задам с моя globalData екземпляр.


person testing    schedule 16.09.2014    source източник
comment
Вероятно не трябва да използвате сингълтън, ако вашият currentFilter може да се промени. В противен случай е добре да го зададете в частния конструктор.   -  person aush    schedule 16.09.2014
comment
@aush: Имам нужда от currentFilter на няколко места. Затова реших да използвам модела Singleton. Мислите ли, че би било по-добре да създам свой собствен гетер и да направя сетера частен от currentFilter? Така че винаги да имам един обект и никога да не създавам друг временно?   -  person testing    schedule 16.09.2014
comment
Какво трябва да използвам вместо сингълтон? Статичен клас, делегати или просто предаване на стойности?   -  person testing    schedule 16.09.2014
comment
Да, ако няма да промените стойност на currentFilter през целия живот на вашия DataCollection, тогава просто поставяте частен сетер и правите присвояване в частния конструктор. Що се отнася до втория ви въпрос, singleton не е лош модел, просто трябва да имате ясна причина защо ви трябва.   -  person aush    schedule 16.09.2014
comment
Добре, мисля, че не съм се изразил правилно. Свойствата на currentFilter се променят. Причината, поради която използвам единичния модел, е, че имам нужда от тези стойности на много места. В момента го използвам с инициализацията в частния конструктор. И зададох въпроса с частния сетер, защото исках да избегна създаването на временен Filter обект. Тъй като направих инициализацията в сингълтона, сега мога да използвам globalData.currentFilter.newEntries = true и вече нямам нужда от моя временен обект.   -  person testing    schedule 16.09.2014
comment
Ясно, разбрах. Не мисля, че причината ви да използвате сингълтън е валидна. Вашият сингълтън е просто статична променлива в този случай. Ако бях на ваше място, определено щях да създам абстракция върху слоя DataCollection и да инжектирам зависимост от него към типовете, които се нуждаят от тази зависимост.   -  person aush    schedule 16.09.2014
comment
@aush: Не разбирам съвета ти. Бихте ли пуснали връзка или нещо подобно, където това е обяснено по-подробно? Може би ще се откажа от сингълтона и ще използвам екземпляр Filter със статични полета и методи.   -  person testing    schedule 16.09.2014
comment
Има много информация за това. Просто потърсете в Google нещо като защо локаторът на услуги е лош и защо статичната променлива е лоша. Също така потърсете в Google инверсия на контрол и инжектиране на зависимости, за да научите за добрите практики.   -  person aush    schedule 16.09.2014


Отговори (1)


Това ли е правилният начин, без да се прави компромис с единичен модел?

Да, singleton е свързан само с наличието на единичен екземпляр и достъпа до този екземпляр, създайте го както искате.

От wikipedia:

В софтуерното инженерство моделът сингълтон е модел на проектиране, който ограничава инстанцирането на клас до един обект. Това е полезно, когато е необходим точно един обект за координиране на действията в системата. Концепцията понякога се обобщава за системи, които работят по-ефективно, когато съществува само един обект, или които ограничават инстанцията до определен брой обекти. Терминът идва от математическата концепция за сингълтън.

Има критики към използването на единичния модел, тъй като някои го смятат за анти-модел, преценявайки, че се използва прекомерно, въвежда ненужни ограничения в ситуации, в които действително не се изисква единствен екземпляр на клас и въвежда глобално състояние в приложение .

Разгледайте тази статия и обсъдете дали единичният модел е правилният избор за вас.

person flindeberg    schedule 16.09.2014