是的。使用嵌套的 observable + 合并:
private readonly Subject<IObservable<EventPattern<EventArgs>> _contexts = new Subject<IObservable<EventPattern<EventArgs>>();
private readonly IObservable<EventPattern<EventArgs>> _saves = _contexts.Merge();
public IObservable<EventPattern<EventArgs>> Saves { get { return _saves; } }
public void AttachContext(DbContext context)
{
_contexts.OnNext(Observable.FromEventPattern<EventArgs>(((IObjectContextAdapter)context).ObjectContext, "SavingChanges"));
}
唯一的问题是,被观察的上下文列表将无限增长,因为Observable.FromEventPattern
永远不会完成。所以这实际上是编码的内存泄漏。
如果您知道db 上下文将用于单次保存,那么您可以在.FirstAsync()
对Observable.FromEventPattern
. 这将导致您的主题在从上下文中看到事件后停止观看上下文。
这仍然会遇到一个问题,即可能附加了一个上下文,但它的保存从未执行(由于逻辑、错误或其他原因)。
我知道解决问题的唯一方法是更改AttachContext
为返回IDisposable
调用者在想要分离上下文时必须使用的:
public IDisposable AttachContext(DbContext context)
{
var detachSignal = new AsyncSubject<Unit>();
var disposable = Disposable.Create(() =>
{
detachSignal.OnNext(Unit.Default);
detachSignal.OnCompleted();
});
var events = Observable.FromEventPattern<EventArgs>(((IObjectContextAdapter)context).ObjectContext, "SavingChanges");
_contexts.OnNext(events.TakeUntil(detachSignal));
return disposable;
}