在这个回答关于Subject<T>
Enigmativity 的问题中提到:
顺便说一句,您应该尽量避免使用主题。一般规则是,如果您使用主题,那么您做错了什么。
我经常使用主题作为IObservable
属性的支持字段,这在 Rx 之前可能是 .NET 事件。例如,而不是类似的东西
public class Thing
{
public event EventHandler SomethingHappened;
private void DoSomething()
{
Blah();
SomethingHappened(this, EventArgs.Empty);
}
}
我可能会
public class Thing
{
private readonly Subject<Unit> somethingHappened = new Subject<Unit>();
public IObservable<Unit> SomethingHappened
{
get { return somethingHappened; }
}
private void DoSomething()
{
Blah();
somethingHappened.OnNext(Unit.Default);
}
}
那么,如果我想避免使用Subject
做这种事情的正确方法是什么?或者我应该坚持在我的界面中使用 .NET 事件,即使它们会被 Rx 代码消耗(很可能FromEventPattern
)?
此外,关于为什么这样使用是一个坏主意的更多细节Subject
会有所帮助。
更新:为了使这个问题更具体一点,我正在谈论使用Subject<T>
作为从非 Rx 代码(也许您正在使用其他一些遗留代码)进入 Rx 世界的一种方式。所以,像:
class MyVolumeCallback : LegacyApiForSomeHardware
{
private readonly Subject<int> volumeChanged = new Subject<int>();
public IObservable<int> VolumeChanged
{
get
{
return volumeChanged.AsObservable();
}
}
protected override void UserChangedVolume(int newVolume)
{
volumeChanged.OnNext(newVolume);
}
}
LegacyApiForSomeHardware 类型不是使用事件,而是让您覆盖虚拟方法,作为获取“刚刚发生”通知的一种方式。