只是一个快速、即兴的回答。
怎么样使用.NET 的反应式扩展 (Rx) http://social.msdn.microsoft.com/Forums/en-US/rx/threads?
然后,您可以将存储库定义为:
public interface IObservableRepository<T> where T : class
{
IObservable<T> GetById(int id);
IObservable<T> GetAll(Func<IQueryable<T>, IQueryable<T>> query);
IObservable<Unit> InsertOnSubmit(T entity);
IObservable<Unit> DeleteOnSubmit(T entity);
IObservable<int> SubmitChanges();
}
所有返回的可观察量都将包含单个值,除了GetAll
其中有零个或多个。
The Unit
类型是void
在 Rx 世界中。这只是一种不需要定义非泛型的方法IObservable
界面。
然后你会像这样查询:
IObservableRepository<Foo> repo = ...;
var foos = repo.GetAll(ts => ts.Where(t => t.Bar == "Hello"));
foos.Subscribe(foo =>
{
// Do something asynchronously with each `Foo`.
});
提交可以这样完成:
var submit =
foos
.Select(foo => repo.InsertOnSubmit(foo)).ToArray()
.Select(s => repo.SubmitChanges());
submit.Subscribe(result =>
{
// handle the asynchronous result of submit.
});
这一切都是基于尝试使存储库方法尽可能接近原始方法,但在 Silverlight 方面可能值得重构为如下所示:
public interface IObservableRepository<T> where T : class
{
IObservable<T> GetById(int id);
IObservable<T[]> GetAll(Func<IQueryable<T>, IQueryable<T>> query);
IObservable<int> Submit(T[] insertsOrUpdates);
IObservable<int> Submit(T[] insertsOrUpdates, T[] deletes);
}
现在提交会好一点:
repo.Submit(foos).Subscribe(result =>
{
// Handle asynchronous result of submit;
});
就像我说的,即兴的。 :-)