![](/img/trans.png)
[英]Using Prism 6 Event Aggregator between view models with an object as the payload
[英]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.