我越來越熟悉RX和我的實驗項目中,我試圖創造概念上類似於一個簡單的命令總線命令總線:撰寫使用RX
class Bus
{
Subject<Command> commands;
IObservable<Invocation> invocations;
public Bus()
{
this.commands = new Subject<Command>();
this.invocations = commands.Select(x => new Invocation { Command = x }).Publish();
}
public IObserver<Command> Commands
{
get { return this.commands; }
}
public IObservable<Invocation> Invocations
{
get { return this.invocations; }
}
}
class Invocation
{
public Command Command { get; set; }
public bool Handled { get; set; }
}
的想法是,模塊可以安裝命令處理程序在啓動時使用Invocations
屬性,並可以應用他們希望對其訂閱進行的任何過濾。另一方面,客戶可以通過調用Commands.OnNext(command)
來觸發命令執行。
但是,我想總線提供一個保證,每個命令提交將由一個處理程序處理。也就是說,OnNext
處理理想情況下,只要第一個處理程序將Invocation.Handled設置爲true,就立即終止處理,如果在OnNext()
,Invocation.Handled
結束時仍然爲假,則應拋出異常。
我打得圍繞創建我自己的ISubject,和的IObservable實現IObserver但這種感覺「骯髒和廉價的」;)
我努力讓我的周圍將RX提供的成分動力頭。在構圖方面,我怎樣才能提供「一次確保」的保證?
感謝您提供的任何見解。
這裏不是[責任鏈模式](http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern)更適合嗎? – dtb 2012-02-12 06:24:55
謝謝@dtb。一旦處理程序被選定,責任鏈可能對管理處理很有用。構建命令總線的方法比這個更簡單和有效。但是,我的問題更多的是關於RX和可組合性的概念。 – 2012-02-12 07:32:16
你見過TPL數據流嗎? – Gabe 2012-02-12 13:47:15