订阅由其他项目中的控制器引发的事件
本文关键字:控制器 事件 其他 项目 | 更新日期: 2023-09-27 18:16:43
我有两个项目在同一个解决方案。一个是ASP。. NET MVC应用程序(A)和另一个是控制台应用程序(C)。我希望C订阅一个事件,该事件将由A中的控制器引发。我使用一个单例类来引发事件,并可以订阅事件。
我订阅了事件,并检查(使用调试器)订阅是否确实存储了,并且可以确认事件在正确的时间被引发。
问题发生时,我开始使用这些项目在一起-即使C订阅的事件,当A提出它的订阅不在EventHandler监听器列表,所以事件不捕获在C
这就像我的单例超出了作用域,或者在项目之间不使用相同的实例。我的Singleton有两个实例
我的目标是从另一个项目中的控制器接收事件。如果没有必要,可以避免使用单例类。
任何帮助都是感激的。
控制器(项目A)
[HttpPost]
public void ProcessCommandMessage(Message message)
{
MessageSpy.Instance.OnMessageReceived(message);
}
MessageSpy (in project 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);
}
我猜你从控制台应用程序添加了一个项目引用到web应用程序?这是行不通的。你说得对:你可能有两个实例。它们都运行在各自独立的进程中,您应该使用消息传递在它们之间进行通信。
通过使用这个SlackMessageSpy
,你的web应用程序和控制台应用程序之间有非常紧密的耦合。您应该通过使用诸如SignalR
(https://www.asp.net/signalr)或Webhooks
(https://docs.asp.net/projects/webhooks/en/latest/overview.html)之类的消息传递组件来解耦这些事件。所以控制器发送一个SignalR消息或调用webhook,控制台应用订阅这个消息。
这可能很简单,让控制器写入包含信息的小文件到控制台应用程序可以访问的位置,并让控制台应用程序读取这些文件。