我遇到的情况是,使用WinForms(订阅者)向用户提供的数据(发布者)很长。修改数据后,我们希望UI也进行更新。最初的想法是使用事件并使UI在发布者上订阅事件。但是,这会导致内存泄漏,因为数据会超出可能出现并呈现的UI各个部分的寿命。
进行一点挖掘,发现MSDN上的WeakEventManager和相关模式。尽管这看起来像一个解决方案,但它引入了一个不完全基本的模式更改,即在发布者和订阅者之间使用中间人(WeakEventManager定制实现)。我们的商店一直都有开发人员在产品和语言之间切换,我担心在未来十年中,一些维护代码的可怜的开发人员将不得不花太多时间试图理解WeakEventManager和这种模式。
由于WeakEventManager已经打破了标准的事件订阅机制,并且继承的实现超过了几行,所以我想知道它是否比以下更清晰的东西有什么真正的好处,可以直接将其添加到发布者(无中间人)。有想法吗?
订户将实现一个接口,例如:
public interface IDataChangedListener
{
void OnDataChanged(Object model);
}
发布者会有这样的东西:
private static List<WeakReference> listeners = new List<WeakReference>();
public static void AddListener(IDataChangedListener listener)
{
lock (listener)
{
listeners.Add(new WeakReference(listener));
}
}
public static void RemoveListener(IDataChangedListener listener)
{
lock (listener)
{
listeners.RemoveAll(x => x.Target == listener);
}
}
private static void NotifyListeners(object model)
{
lock (listeners)
{
listeners.RemoveAll(x => !x.IsAlive); //Purge
foreach (IDataChangedListener listener in listeners)
{
if (listener != null)
{
listener.OnDataChanged(model);
}
}
}
}
有想法吗?