W zdecydowanej większości przypadków jestem przeciwnikiem singleton’a i uważam to za anty-wzorzec. Dużo lepiej użyć IoC i przekazywać wszędzie w konstruktorach tą samą instancję. Istnieją jednak przypadki, w których użycie singleton’a nie jest brzydkie. Ostatnio miałem klasę, która potrzebowała pewnych danych – kolekcję prostych struktur. Każda struktura zawiera string i pole bool. Ze względu, że […]
Dziś jak obiecałem, praktyczny przykład wykorzystania WeakReference ( o którym mowa była kilka postów wcześniej). Zdarzenia są częstym powodem memory leak. Na przykład: public class ReportViewModel { public void Init(EmployeesViewModel employeesVm) { employeesVm.PropertyChanged+=EmployeesPropertyChanged; } private void EmployeesPropertyChanged(object sender,EventArgs e) { // logika } } Następnie gdzieś w kodzie tworzymy ReportViewModel, wykonujemy jakieś operację i usuwamy […]
Chciałbym poświęcić kilka postów na opisanie WeakReference oraz praktycznych przykładów wykorzystania tej klasy. W dzisiejszym wpisie strona teoretyczna i opis klasy. Referencje w środowisku .NET można podzielić na słabe (weak references) oraz silne\mocne (strong references). Silne referencje są wszystkim doskonale znane np: var sampleClass = new SampleClass(); Innymi słowy jest to standardowy typ powiązania. W […]
W poprzednim poście podałem prostą implementację zdarzeń opartych na słabych referencjach. Zachęcam najpierw do przeczytania poprzedniego wpisu bo bez niego będzie ciężko zrozumieć dzisiejszy post. Dziś implementacja zaproponowana na blogu Paul Stovell’a: public sealed class WeakEventHandler<TEventArgs> where TEventArgs : EventArgs { private readonly WeakReference _targetWeakReference; private readonly MethodInfo _handlerMethodInfo; public WeakEventHandler(EventHandler<TEventArgs> strongEventHandler) { _handlerMethodInfo = […]
Dziś miało być o praktycznym przykładzie wykorzystania WeakReference ale stwierdziłem, że najpierw powrócimy znów na chwilę do WPF. Co myślicie o takiej prostej klasie: class TimePresenterViewModel:BaseViewModel { private readonly DispatcherTimer _timer; const int RefreshTime=6*1000; public TimePresenterViewModel() { _timer=new DispatcherTimer(); _timer.Interval = TimeSpan.FromMilliseconds(RefreshTime); _timer.Tick += TimerTick; _timer.Start(); } void TimerTick(object sender, EventArgs e) { // jakas […]
platforma .NET, patterns & practices, .NET dla enterprise