[英]How do I create a hot RX observable from multiple DBContexts
DBContexts對於每個請求都是短暫的,創建和銷毀的。 在保存之前和之后,我有許多任務要執行,我想用某種事件模型來處理這些任務。 我想知道RX是正確的路線。
有什么方法可以創建單例“集線器”,然后使我的DBContext引發BeforeChange(SavingChanges事件)並發布保存(無適用事件)Observables,然后將它們“推入”壽命長的集線器中。
實際上,我想在“集線器”單例中執行此操作
public IObservable<EventPattern<EventArgs>> Saves = new Subject<EventPattern<EventArgs>>();
public void AttachContext(DbContext context)
{
Saves = Observable.FromEventPattern<EventArgs>(((IObjectContextAdapter)context).ObjectContext, "SavingChanges");
}
但是以這樣的方式,AttachContext只是將其生成的可觀察對象喂入到現有的Saves觀察對象中,而不是替換它(及其所有訂閱)?
是。 使用嵌套的可觀察+合並:
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上下文將用於一次保存,則可以在對Observable.FromEventPattern
的調用的末尾添加.FirstAsync()
。 一旦看到主題事件,這將導致您的主題停止觀看上下文。
這仍然遭受以下問題的困擾:可能附加了上下文,但從未執行過“保存”操作(由於邏輯,錯誤或其他原因)。
我知道解決此問題的唯一方法是更改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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.