C# 有哪些替代方法可以沿调用链传播事件?
C# What alternative ways are there to propagate an Event down a call chain?
假设 Main.c
s 调用 sub.cs
,后者又调用 action.cs
。 action.cs
引发 sub.cs
订阅的事件,但是,sub.cs
不关心事件,只有 main.cs
想知道这个所以 sub.cs
再次引发事件,以便 main.cs
可以订阅它并发现 action.cs
引发了原始事件;这看起来很麻烦。
除了通过一系列方法调用传递事件之外,还有哪些替代方法?
您可能希望对主题使用 pub-sub,例如参见 [=10=]
(您不需要 rabbitmq,因为您可以自己实现简单的 pub-sub 或从 github/MSDN 中获取一个,请参阅:https://msdn.microsoft.com/en-us/library/ms752254(v=vs.110).aspx, https://github.com/upta/pubsub/blob/master/README.md)
你可以直接在Action
中暴露的事件中附加Sub
中暴露的事件,当然事件需要在Sub
和Action
中暴露:
class SubClass
{
public event EventHandler MyEvent
{
add
{
_action.MyEvent += value;
}
remove
{
_action.MyEvent -= value;
}
}
private ActionClass _action;
}
使用此解决方案,您仍然需要声明两次事件,但您不需要链接方法调用,并且可以在 SubClass
中省略事件处理程序。
当然还有其他选择,但您可能需要更改设计,而且我没有足够的上下文来提出任何建议。一般来说,我会从最简单的解决方案开始。如果您只需要 冒泡 一个事件,这可能就足够了,但是如果您需要公开其中的许多事件,那么您可以考虑引入第三个对象,它公开您需要的内容并通过 SubClass
来自 ActionClass
,像这样(但请用更好的名字):
public sealed class Notifications
{
public event EventHandler MyEvent;
internal void RaiseMyEvent(EventArgs e)
{
var myEvent = MyEvent;
if (myEvent != null)
myEvent(this, e);
}
}
class MyAction
{
public Notifications Notifications
{
get { return _notifications; }
}
// ...
}
class SubClass
{
public Notifications Notifications
{
get { return _action.Notifications; }
}
// ...
}
请注意,此示例只是概念验证。
您可以使用回调而不是事件。
您可以将回调函数作为附加参数添加到方法链的方法中。
例如。如果方法是 doSomething()
将其替换为 doSomething(Action action)
并且 Main.c 将调用此方法 Sub.doSomething(() => ReactToTheEvent());
并且 Action.cs 调用 action();
insetad 引发事件。
假设 Main.c
s 调用 sub.cs
,后者又调用 action.cs
。 action.cs
引发 sub.cs
订阅的事件,但是,sub.cs
不关心事件,只有 main.cs
想知道这个所以 sub.cs
再次引发事件,以便 main.cs
可以订阅它并发现 action.cs
引发了原始事件;这看起来很麻烦。
除了通过一系列方法调用传递事件之外,还有哪些替代方法?
您可能希望对主题使用 pub-sub,例如参见 [=10=]
(您不需要 rabbitmq,因为您可以自己实现简单的 pub-sub 或从 github/MSDN 中获取一个,请参阅:https://msdn.microsoft.com/en-us/library/ms752254(v=vs.110).aspx, https://github.com/upta/pubsub/blob/master/README.md)
你可以直接在Action
中暴露的事件中附加Sub
中暴露的事件,当然事件需要在Sub
和Action
中暴露:
class SubClass
{
public event EventHandler MyEvent
{
add
{
_action.MyEvent += value;
}
remove
{
_action.MyEvent -= value;
}
}
private ActionClass _action;
}
使用此解决方案,您仍然需要声明两次事件,但您不需要链接方法调用,并且可以在 SubClass
中省略事件处理程序。
当然还有其他选择,但您可能需要更改设计,而且我没有足够的上下文来提出任何建议。一般来说,我会从最简单的解决方案开始。如果您只需要 冒泡 一个事件,这可能就足够了,但是如果您需要公开其中的许多事件,那么您可以考虑引入第三个对象,它公开您需要的内容并通过 SubClass
来自 ActionClass
,像这样(但请用更好的名字):
public sealed class Notifications
{
public event EventHandler MyEvent;
internal void RaiseMyEvent(EventArgs e)
{
var myEvent = MyEvent;
if (myEvent != null)
myEvent(this, e);
}
}
class MyAction
{
public Notifications Notifications
{
get { return _notifications; }
}
// ...
}
class SubClass
{
public Notifications Notifications
{
get { return _action.Notifications; }
}
// ...
}
请注意,此示例只是概念验证。
您可以使用回调而不是事件。
您可以将回调函数作为附加参数添加到方法链的方法中。
例如。如果方法是 doSomething()
将其替换为 doSomething(Action action)
并且 Main.c 将调用此方法 Sub.doSomething(() => ReactToTheEvent());
并且 Action.cs 调用 action();
insetad 引发事件。