【发布时间】:2012-10-16 19:57:16
【问题描述】:
我一直在寻找使用弱事件模式订阅事件。使用 .NET 4.5 框架,我们有一个漂亮的 WeakEventManager 类。弱订阅一个事件就这么简单
WeakEventManager<EventSource, SomeEventEventArgs>.AddHandler(source, "SomeEvent", source_SomeEvent);
不过,我不是“字符串类型”代码的忠实拥护者。我一直在尝试找到一种方法来使用要订阅的事件的字符串名称。我发现获取事件名称的only way 是在定义事件的类中使用 lambda 表达式。在我的场景中,我拥有定义事件的类,因此我可以随意更改它。我一直在尝试找到一种干净的方式来订阅和取消订阅我的活动,这是我最不喜欢的。
public event EventHandler<EventArgs> LoggingOn;
public event EventHandler<EventArgs> LoggingOn_Weak
{
add
{
var eventName = this.GetEventName(() => this.LoggingOn);
WeakEventManager<CurrentUser, EventArgs>.AddHandler(this, eventName, value);
}
remove
{
var eventName = this.GetEventName(() => this.LoggingOn);
WeakEventManager<CurrentUser, EventArgs>.RemoveHandler(this, eventName, value);
}
}
// In a base class view model in my scenario
private string GetEventName<T>(System.Linq.Expressions.Expression<Func<T>> expression)
{
return (expression.Body as System.Linq.Expressions.MemberExpression).Member.Name;
}
protected void OnLoggingOn(object sender, EventArgs e)
{
var handler = this.LoggingOn;
if (handler != null)
{
handler(sender, e);
}
}
使用custom event accessors 我能够避免笨拙的(在我看来)方法,如 LoggingOn_Subscribe(EventHandler) 或为每个事件添加名称属性。不幸的是,订阅该事件的人以经典方式订阅该事件并不那么直观,但除了名称中的“_Weak”部分之外一无所知,表明它正在被弱订阅。
至于我的问题..
1) 我以前从未使用过弱事件或自定义事件访问器。上面的代码似乎可以工作,但是,我只想确保它在技术上没有任何问题。有什么我正在做的事情是为了在脚上开枪吗?
2) 从设计的角度来看,这是一个糟糕的想法吗?我应该考虑任何主要的设计问题吗?有更好的选择吗?我是否应该接受它并使用字符串类型的事件名称从我的订阅者那里订阅?
想法?
【问题讨论】:
标签: c# .net weak-events