簡體   English   中英

Prism 事件聚合器的通用有效負載

[英]Generic Payload for Prism Event Aggregator

我正在開發一個 WPF 應用程序並嘗試設計一些使用 Prism 的事件聚合器驅動的事件。

目前我正在嘗試為 Prism 事件實現類似事件隊列的東西。 為此,我想訂閱相關事件並將它們傳遞給相同的方法,但事件聚合器希望這些方法與事件具有相同的簽名。

示例事件:

public class TestEvent1 : PubSubEvent<Class1>
{
}
public class TestEvent2 : PubSubEvent<Class2>
{
}
public class TestEvent3 : PubSubEvent<List<Class3>>
{
}
public class TestEvent3 : PubSubEvent<string>
{
}

訂閱:

        _eventAggregator.GetEvent<TestEvent1>().Subscribe(OnTestEvent1, true);
        _eventAggregator.GetEvent<TestEvent2>().Subscribe(OnTestEvent2, true);
        _eventAggregator.GetEvent<TestEvent3>().Subscribe(OnTestEvent3, true);

示例回調方法:

    private void OnTestEvent1(Class1 object1)
    {
        // do something      
    }

因為我只在事件發布時接收數據,所以我嘗試了這樣的事情來用作事件有效負載類型,但它看起來不正確:

// Payload
public interface IMessage
{
    public object Data { get; set; }
    public Type Datatype { get; set; }
    public PubSubEvent EventType { get; set; }
}

// Events
public class TestEvent1 : PubSubEvent<IMessage>
{
}
public class TestEvent2 : PubSubEvent<IMessage>
{
}
public class TestEvent3 : PubSubEvent<IMessage>
{
}

// Subscriptions
_eventAggregator.GetEvent<TestEvent1>().Subscribe(EventHandler, true);
_eventAggregator.GetEvent<TestEvent2>().Subscribe(EventHandler, true); 
_eventAggregator.GetEvent<TestEvent3>().Subscribe(EventHandler, true);

// Callback
private void EventHandler(IMessage payload)
{
    // do something      
}

這是可行的,我該如何改進或更改我的“通用”有效負載?

額外信息:在我的場景中,我有多個 UDP 服務器定期接收新數據,將其反序列化為對象並發布事件。 相關的“經理”訂閱了這些事件,並在收到新數據時被觸發。

我的目標是嘗試在我的事件接收類中實現一個類似系統的事件隊列,以便更容易處理多線程問題。

這里有一些圖表可以幫助我更好地解釋自己:

我的架構:

在此處輸入圖片說明

我的“事件隊列”

在此處輸入圖片說明

這更像是一個代碼審查問題,不是嗎?

不過,我更喜歡強類型,而且我不想圍繞事件聚合器構建一個隊列,這總是乏味的,因為你永遠不知道新的事件類型何時出現。 相反,我會構建自己的事件聚合器,內置隊列(從現有的隊列開始)。

此外,我會研究數據流,例如,因為事件聚合器的基本工作模式(即發即忘、一個發送者、多個或無接收者)似乎不適用於排隊。 如果您在發送方排隊,是等待一個接收方還是所有接收方? 當沒有接收器時你排隊還是丟棄? 如果您在接收方排隊,何必費心呢? 接收者可以自己實現隊列。

當您發布帶有對象引用的事件時,請考慮以下潛在問題:

  • 任何偵聽器都將取決於事件參數的類型/程序集。
  • 引用的對象將保留一段時間。 多長時間? 你不知道。
  • 引用的對象可能已被更改/處置。
  • 偵聽器可能會在不同的線程上處理引用的對象。

在處理PubSubEvent<T>幾年之后,我相信只有一種合適的模式可以成功處理所有情況。 使用唯一標識符(例如Guid發布您的事件。

public class MyItemAddedEvent : PubSubEvent<Guid> {}

然后在您偵聽此事件的任何地方注入一個提供程序:

public class SomeListener
{
    private readonly IMyItemProvider myItemProvider;

    [ImportingConstructor]
    public SomeListener(IEventAggregator eventAggregator,
                        IMyItemProvider myItemProvider)
    {
        this.myItemProvider = myItemProvider;

        eventAggregator.GetEvent<MyItemAddedEvent>().Subscribe(OnMyItemAdded, true);
    }

    private void OnMyItemAdded(Guid id)
    {
        var myItem = myItemProvider.Get(id);
        // Do stuff
    }
}

現在,提供者類的責任是提供一個有效且最新的對象,並給定一個唯一的 id。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM