2013-07-04 98 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