Система сообщений со строго типизированным объектом сообщения - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть вопрос об изменении системы сообщений, которую я построил. Для ясности используйте псевдокод, чтобы показать, как он работает. Этот вопрос будет не о конкретном c бите кода, а о том, есть ли способ сделать то, что я хочу. Я попытался и просто получил вложенность в сложности, которая не работала.

Итак, теперь у меня работает система сообщений, которая вызывает метод при публикации сообщения. Он передает объект, и метод должен привести объект к правильному классу. Я пытаюсь сделать так, чтобы сообщение publi sh передавало аргумент типа generi c и то же самое, когда вы регистрируете слушателя / подписчика, вам нужно передать аргумент типа. В результате метод обратного вызова получит правильный типизированный объект. Я пробовал несколько способов, используя и. Кроме того, тип MessageType хранится в объекте прослушивателя, чтобы знать, к чему присылать сообщение при широковещательной передаче.

Увы, мои неудачные попытки пропали, поэтому у меня просто есть этот псевдокод, я рефакторинг его в более простую версию, которая передает на объекте.

// ТЕКУЩАЯ СООБЩЕНИЕ с использованием объекта - псевдокод

Listener    
string topic,
Action<object> callback,
object message

MessageBus
ListOfListeners<Listeners>

void Register(string topic,Action<object> callback)
{
    Listeners.Add(new Listener(topic, callback));

}

void Publish (string topic, object message)
{
    foreach listener    
    {
        if(listener.topic == topic)
        {   
            listener.callback.invoke(message);

        }
    }
}


 MyClass

void setup ()
{
    MessageBus.Register("somethingHappened", ReactToSomething );

}

void ReactToSomething( object message)
{

    SomethingHappened info =  (SomethingHappened)message;
    React(info);

} 


 MyOtherClass

void Broadcast_TheThingHappened()
{
    var happening = new SomethingHappened("Help me Obi Wan!");
    MessageBus.Publish("somethingHappened", happening );

}

// СООБЩЕНИЕ - идеальный код сна с использованием типизированного возвращаемого объекта - псевдокод

Listener<T>     
string topic,
Action<T> callback,
Type messageType // Im not sure about this
object message

MessageBus
ListOfListeners<Listeners>

void Register<T>(string topic,Action<T> callback)
{
    Listeners.Add(new Listener<T>(topic, callback, typeof(T));

}

void Publish<T> (string topic, <T> message)
{
    foreach listener    
    {
        if(listener.topic == topic)
        {   var callback = (Action<T>)listener.Callback;
            callback.invoke(message);

        }
    }
}

    MyClass

    void setup ()
    {
        MessageBus.Register<SomethingHappened>("somethingHappened", ReactToSomething );

    }

    void ReactToSomething( SomethingHappened message)
    {

        SomethingHappened info =  (SomethingHappened)message;
        React(info);

    } 


    MyOtherClass

    void Broadcast_TheThingHappened()
    {
        var happening = new SomethingHappened("Help me Obi Wan!");
        MessageBus.Publish<SomethingHappened>("somethingHappened", happening );

    }
...