无效扩展IObservable在订户订阅时通知
问题描述:
我有一个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
通知。
答
无论这个
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。
答
这是丑陋的一切,但也可能会被提出的工作
var subj = new Subject<string>();
var io = Observable.Defer(() => Observable.Return("Subscribed")
.Do(Console.WriteLine))
.Concat(subj);
io.Subscribe();
如果您使用的是CreaetWithDisposable,除非您需要主题子类的功能,否则几乎完全可以跳过该主题。 – 2011-03-29 07:26:22
我正在尝试做这项工作。我无法看到Console.WriteLine(“订阅”);一切都在开火。即使在订阅“o”时,即使在多次订阅该主题时,我也只会看到它一次点燃。 – Doanair 2011-03-29 17:22:12
@doanir然后你正在做一些不正确的事情 - 因为在两种情况下,我都会在每个订阅上看到“订阅”输出。尝试发布您使用的测试功能。 – 2011-03-29 17:31:30