Просто быстрый ответ с манжеты.
Как насчет использования Реактивных расширений для .NET (Rx) ?
Затем вы можете определить свой репозиторий как:
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
, который будет иметь ноль или более.
Тип 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;
});
Как я уже сказал, с манжеты. : -)