我可能完全误解了RX的含义,但我认为这将是一种允许代码中的各种客户端应用程序订阅某些实体框架代码优先类型的更改通知的巧妙方式。
所以在我的UOW提交方法中,我有
var changes = DbContext.ChangeTracker.Entries<EntEvent>().Where(ee => ee.State != EntityState.Unchanged);
Hub.Instance.NotifyBeforeSave(changes);
我的(相当基本的)hub类看起来是这样的。。。
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来订阅客户端(observer)。
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度,但我们必须从某个地方开始!
问题是没有异步源。
DbContext.ChangeTracker.Entries<EntEvent>()
是一个集合。您可以使用将其转换为可观测
IEnumerble.ToObservable();
但这并不意味着它是异步的。事实上,它会在订阅后立即枚举集合。如果集合恰好为空,它将完全不起任何作用。用谷歌搜索冷/热可观测值之间的差异以了解。您需要一个异步源,类似于事件。
我不太了解EF,我猜
((IObjectContextAdapter)DbContext).ObjectContext.SavingChanges
活动可能正是您所需要的。
祝你好运!
插入Nick的
https://github.com/NickStrupat/EntityFramework.Triggershttps://github.com/NickStrupat/EntityFramework.Rx
他有一些模式,无论是否源于他的背景,这是允许的:
DbObservable<Context>.FromInserted<Person>();