簡體   English   中英

如何從多個DBContext創建可觀察的熱RX

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM