我在同一个解决方案中有 2 个项目。一个是 ASP.NET MVC 应用程序 (A),另一个是控制台应用程序 (C)。我希望 C 订阅将由 A 中的 Controller 引发的事件。我使用单例类来引发该事件并可以订阅该事件。
我订阅了该事件并检查(使用调试器)该订阅确实已存储,并且可以确认该事件在正确的时间引发。
当我开始一起使用这些项目时,问题就发生了 - 即使 C 订阅了该事件,当 A 引发该事件时,该订阅不在 EventHandler 监听器列表中,因此该事件在 C 中不会被咳嗽。
这就像我的单例超出了范围或者项目之间没有使用相同的实例。我有点意识到我有两个 Singleton 实例。
我的目标是从另一个项目中的 Controller 接收事件。如果没有必要,可以避免 Singleton 类。
感谢任何帮助。
Controller (在项目 A 中)
[HttpPost]
public void ProcessCommandMessage(Message message)
{
MessageSpy.Instance.OnMessageReceived(message);
}
MessageSpy(在项目 A 中)
{
private static readonly MessageSpy _instance = new MessageSpy();
public static MessageSpy Instance { get { return _instance; } }
static MessageSpy() { }
private MessageSpy() { }
public event EventHandler<Message> MessageReceived;
public virtual void OnMessageReceived(Message message)
{
if (MessageReceived != null)
{
MessageReceived(this, message);
}
}
}
订阅者(项目 C 中)
private void Run()
{
SlackMessageSpy.Instance.MessageReceived += Instance_MessageReceived;
}
static void Instance_MessageReceived(object sender, OutgoingHookMessage e)
{
Trace.WriteLine(e.Text);
}
最佳答案
我认为您从控制台应用程序添加了对网络应用程序的项目引用?这是行不通的。您说得正确:您可能有两个实例。两者都在各自独立的进程中运行,您应该使用消息传递在它们之间进行通信。
通过使用此 SlackMessageSpy
,您的 Web 应用程序和控制台应用程序之间的耦合非常紧密。您应该使用一些消息传递组件来解耦这些事件,例如 SignalR
( https://www.asp.net/signalr ) 或 Webhooks
( https://docs.asp.net/projects/webhooks/en/latest/overview.html )。因此, Controller 发送 SignalR 消息或调用 Webhook,并且控制台应用程序订阅此消息。
这可能很简单,只需让 Controller 将包含信息的小文件写入控制台应用程序可以访问的位置,然后让控制台应用程序读取这些文件。
关于c# - 订阅其他项目中的 Controller 引发的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40447491/