2011-03-28 46 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();