订阅由其他项目中的控制器引发的事件

本文关键字:控制器 事件 其他 项目 | 更新日期: 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,控制台应用订阅这个消息。

这可能很简单,让控制器写入包含信息的小文件到控制台应用程序可以访问的位置,并让控制台应用程序读取这些文件。