2011-03-28 86 views
2

我有一個Subject<T>,我希望在訂閱某個訂閱時收到通知。我找不到這個機制。我錯過了什麼嗎?無效擴展IObservable在訂戶訂閱時通知

例如:

public class AccountManager 
    { 
     private ReplaySubject<string> _accountEvents = new ReplaySubject<string>(); 

     public AccountManager() 
     { 
     } 

     public void Add(string val) 
     { 
      _accountEvents.OnNext(val); 
     } 

     public IObservable<string> AccountEvents { get { return _accountEvents.AsObservable<string>(); } } 

    } 

當任何其他代碼調用AccountEvents財產Subscribe可以AccountManager通知。

回答

5

無論這個

 var subj = new Subject<string>(); 
     var o = Observable.CreateWithDisposable<string>(observer => 
              { 
               Console.WriteLine("subscribed"); 
               return subj.Subscribe(observer); 
              }); 

或(類似斯科特的答案)

 var o = Observable.Defer(() => 
            { 
             Console.WriteLine("subscribed"); 
             return subj; 
            }); 

在第一種情況下,你有更多的自由,因爲你有一個觀察者作爲參數傳入,所以除了將主體輸出路由到觀察者當你的邏輯需要它時,你可以調用observer.OnNext,OnError,OnComplete。

+1

如果您使用的是CreaetWithDisposable,除非您需要主題子類的功能,否則幾乎完全可以跳過該主題。 – 2011-03-29 07:26:22

+0

我正在嘗試做這項工作。我無法看到Console.WriteLine(「訂閱」);一切都在開火。即使在訂閱「o」時,即使在多次訂閱該主題時,我也只會看到它一次點燃。 – Doanair 2011-03-29 17:22:12

+0

@doanir然後你正在做一些不正確的事情 - 因爲在兩種情況下,我都會在每個訂閱上看到「訂閱」輸出。嘗試發佈您使用的測試功能。 – 2011-03-29 17:31:30

0

這是醜陋的一切,但也可能會被提出的工作

var subj = new Subject<string>(); 
var io = Observable.Defer(() => Observable.Return("Subscribed") 
              .Do(Console.WriteLine)) 
        .Concat(subj); 
io.Subscribe();