Това е текущият ми сингълтън:
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
екземпляр.
currentFilter
може да се промени. В противен случай е добре да го зададете в частния конструктор. - person aush   schedule 16.09.2014currentFilter
на няколко места. Затова реших да използвам модела Singleton. Мислите ли, че би било по-добре да създам свой собствен гетер и да направя сетера частен отcurrentFilter
? Така че винаги да имам един обект и никога да не създавам друг временно? - person testing   schedule 16.09.2014currentFilter
през целия живот на вашияDataCollection
, тогава просто поставяте частен сетер и правите присвояване в частния конструктор. Що се отнася до втория ви въпрос, singleton не е лош модел, просто трябва да имате ясна причина защо ви трябва. - person aush   schedule 16.09.2014currentFilter
се променят. Причината, поради която използвам единичния модел, е, че имам нужда от тези стойности на много места. В момента го използвам с инициализацията в частния конструктор. И зададох въпроса с частния сетер, защото исках да избегна създаването на времененFilter
обект. Тъй като направих инициализацията в сингълтона, сега мога да използвамglobalData.currentFilter.newEntries = true
и вече нямам нужда от моя временен обект. - person testing   schedule 16.09.2014DataCollection
и да инжектирам зависимост от него към типовете, които се нуждаят от тази зависимост. - person aush   schedule 16.09.2014Filter
със статични полета и методи. - person testing   schedule 16.09.2014