c# - 订阅其他项目中的 Controller 引发的事件

标签 c# asp.net events asp.net-web-api

我在同一个解决方案中有 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/

相关文章:

C# Enum.TryParse 解析无效数字字符串

javascript - 如何添加带有图像的选项以在页面加载期间进行选择?

c# - 如何比较 messagepack-cli 和 json.net 反序列化器的性能?

c# - 我的 Asp.Net 空 Web 应用程序项目中缺少 Global.asax 文件

c# - 从 ASP.net webform 中的 c# 类调用方法

C# 相当于 Google Maps API 的 computeArea

javascript - 如何使用 jQuery ajax 请求触发事件处理程序背后的代码

C# 通用事件处理 - 链接/代理

jsf - p :ajax event for pagination of lazy p:dataTable

wpf - 什么是 WPF 预览事件?