订阅控制器在其他项目中提出的事件

时间:2016-11-06 08:47:12

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

我在同一个解决方案中有2个项目。一个是ASP.NET MVC应用程序(A),另一个是控制台应用程序(C)。我希望C订阅将由A中的控制器引发的事件。我正在使用一个单例类来引发事件并可以订阅该事件。

我订阅了该事件并检查(使用调试器)确实存储了订阅,并且可以确认该事件是在正确的时间引发的。

当我开始一起使用这些项目时会出现问题 - 即使C订阅了该事件,当A引发它时,订阅不在EventHandler监听器列表中,因此事件在C中不合适。

就像我的单身人士超出范围或者在项目之间不使用相同的实例。我有点填充,我有两个我的Singleton实例。

我的目标是从另一个项目的控制器接收事件。如果没有必要,可以避免使用Singleton类。

感谢任何帮助。

控制器(在项目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);
}

1 个答案:

答案 0 :(得分:1)

您从我假设的控制台应用中添加了对Web应用的项目引用?这不会起作用。您已正确说明:您可能有两个实例。两者都在自己独立的进程中运行,您应该使用消息传递它们之间进行通信。

使用此SlackMessageSpy,您的网络应用和控制台应用之间的耦合非常紧密。您应该使用某些消息传递组件(例如SignalRhttps://www.asp.net/signalr)或Webhookshttps://docs.asp.net/projects/webhooks/en/latest/overview.html)来解耦这些事件。因此,控制器发送SignalR消息或调用webhook,控制台应用程序订阅此消息。

让控制器将带有信息的小文件写入控制台应用程序可以访问的位置并让控制台应用程序读取这些文件可能非常简单。