多项目解决方案中的事件驱动设计

Event driven design in a multiple project solution

我尝试用 Xamarin.ios 做一个 iOS 应用程序。我有一个服务器,我可以在其中使用 websockets 将事件发送到我的应用程序。但是处理这个事件的功能是在另一个项目中实现的。

因此,如果服务器发送新事件,我想告诉 iOS 项目新事件已到达。我不能 return 因为我不能将两个项目相互引用。

如何在一个解决方案中为多个项目实施事件驱动设计?

这是我当前的代码:

iOS 项目

    public partial class LobbyViewController : UIViewController
{


    public LobbyViewController (IntPtr handle) : base (handle)
    { 
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();                   
    }

    public void changePage()
    {
        UIViewController introViewController = Storyboard.InstantiateViewController("IntroViewController") as IntroViewController;
        introViewController.ModalTransitionStyle = UIModalTransitionStyle.CoverVertical;
        PresentViewController(introViewController, true, null);
    }
}

一般项目(我的活动到达的地方)

public static class Sockets
{
    public static Socket socket;
    static bool isConnected = false;

    public static void Main(string token)
    {
        socket = connect(token);
    }

    private static Socket connect(string Token)
    {
        var options = new IO.Options();
        options.Query = new Dictionary<string, string>()
        {
            { "token", Token }
        };

        var socket = IO.Socket(Resource.SocketsUrl, options);

        socket.On(Socket.EVENT_CONNECT, () =>
        {
            isConnected = true;
        });

        socket.On(Socket.EVENT_ERROR, (error) =>
        {
            appendLogMessage("ERROR! " + error.ToString(), true);
        });

        socket.On(Socket.EVENT_DISCONNECT, (data) =>
        {
            isConnected = false;
            appendLogMessage("Disconected");
        });

        socket.On(Socket.EVENT_MESSAGE, (data) =>
        {
            appendLogMessage(data.ToString(), true);
        });

        socket.On("lobbyParticipantAdded", (data) =>
        {
            appendLogMessage(data.ToString(), true);
        });

        socket.On("lobbyFlowStart", (data) =>
        {
            appendLogMessage(data.ToString(), true);
        });

        socket.On("quizQuestion", (data) =>
        {
            appendLogMessage(data.ToString(), true);
        });

        socket.On("gameEnd", (data) =>
        {
            appendLogMessage(data.ToString(), true);
        });

        return socket;
    }
 }

我找到了解决我的问题的方法...我创建了一个新的 class,我可以在其中将我的结果返回到另一个项目...首先您应该将其添加到您的主项目中:

SocketsEventHandler.Add("eventname", callback);

这会将事件名称添加到 SocketsEventHandlerClass 中的 Dictionary

SocketsEventHandlerClass 将如下所示:

    public class SocketEventHandler
{
    static SocketEventHandler()
    {
        callbackList = new Dictionary<string, List<Action<dynamic>>>();
    }

    public static Dictionary<string, List<Action<dynamic>>> callbackList;

    public static void Add(string eventName, Action<dynamic> callback)
    {
        if (callbackList.ContainsKey(eventName))
        {
            callbackList[eventName].Add(callback);
        }
        else
        {
            callbackList.Add(eventName, new List<Action<dynamic>> { callback });
        }
    }

    public static void Fire(string eventName, dynamic payload)
    {
        try
        {
            List<Action<dynamic>> actions = callbackList[eventName];

            foreach (var item in actions)
            {
                item(payload);
            }
        }
        catch (Exception e) { }
    }

当你想向主项目发射一些东西时,你可以简单地说:

SocketEventHandler.Fire("eventname", payload);

我希望这对其他人有所帮助!

编辑:
我只是用一个例子创建了一个 git 仓库:

MultiProjectEventHandler

享受吧!