2013-07-04 154 views
1

我可能完全誤解了RX的全部內容,但我認爲這將是一種簡潔的方式,允許我的代碼中的各種客戶端應用程序訂閱某些實體框架代碼優先類型。用RX訂閱EF更改

所以在我的UOW提交methood我

 var changes = DbContext.ChangeTracker.Entries<EntEvent>().Where(ee => ee.State != EntityState.Unchanged); 
     Hub.Instance.NotifyBeforeSave(changes); 

和我的(而不是基本的)集線器類看起來像這樣...

public sealed class Hub 
{ 
    private static readonly Hub instance = new Hub(); 
    static Hub(){} 
    private Hub(){} 
    public static Hub Instance 
    { 
     get { return instance; } 
    } 

    public IObservable<System.Data.Entity.Infrastructure.DbEntityEntry<EntEvent>> BeforeSave = new Subject<DbEntityEntry<EntEvent>>(); 
    public void NotifyBeforeSave<T>(IEnumerable<System.Data.Entity.Infrastructure.DbEntityEntry<T>> changes) where T:class 
    { 
     var x = changes.Where(c => typeof(T) == typeof(EntEvent)) as IEnumerable<System.Data.Entity.Infrastructure.DbEntityEntry<EntEvent>>; 
     BeforeSave = x.ToObservable(); 
    } 
} 

,然後我想我可以訂閱一個客戶端(觀察者)通過創建以下的實例並調用attach來實現。

public class SampleConsumer : IObserver<DbEntityEntry<EntEvent>> 
{ 
    public void attach() 
    {    
     Hub.Instance.BeforeSave.Subscribe(this); 
    } 

    public void OnNext(DbEntityEntry<EntEvent> value) 
    { 
     var x = value; 
    } 

    public void OnError(Exception error) 
    { 
     var y = error; 
    } 

    public void OnCompleted() 
    { 
    } 
} 

但OnNext和OnError中的斷點永遠不會被調用。

我可能距離我應該的地方180度,但我們必須從某個地方開始!

回答

1

問題是您沒有異步源。

DbContext.ChangeTracker.Entries<EntEvent>() 

是一個集合。您可以使用

IEnumerble.ToObservable(); 

將其轉換爲可觀察值,但這並不會使其異步。事實上,它將在訂閱後立即列舉收集。如果集合恰好是空的,那麼它什麼都不會做。谷歌冷/熱可觀察到的區別理解。 你需要一個異步源,就像一個事件。

我不知道EF非常好,我的猜測是,

((IObjectContextAdapter)DbContext).ObjectContext.SavingChanges 

事件可能是你所需要的。

祝你好運!

+0

是的,我一直在閱讀有關熱/冷最後晚。我想我希望能夠有一種方法,在被調用時將IEnumerable推入一個可觀察的事件中。 – Andiih

+0

我想問題是DBContext是短命的,而我需要的訂閱是長期存在的,因此消費者可以訂閱的集線器的想法一個長期存在的Observable和創造者可以將事件推入其中。這甚至有可能嗎? – Andiih