c# – 用于Silverlight 4 WCF数据服务的IAsyncRepository或IObservableRepository

更新2:@Enigmativity有一个很好的答案.我已将其实现为IObservableRepository< T>.我的答案详情如下.

题:
所以我改变了大部分问题(请参阅编辑历史记录)如果有人对我的设计进行了评论/验证/推测,我会很喜欢. =)

所以通常我的Repos看起来像这样:

public interface IRepository<T> where T : class
{
    T GetById(int id);
    IQueryable<T> GetAll();
    void InsertOnSubmit(T entity);
    void DeleteOnSubmit(T entity);
    int SubmitChanges();
}

但是当谈到Silverlight和WCF数据服务时,它会使所有异步的查询相关数据变得非常烦人.我必须首先加载父实体异步,然后查询其子实体异步.

所以我提出了一个IAsyncRepository,我想知道设计是否正常,是否可以改进,(以及在这里使用Rx是否有意义?)

要解决子实体问题,我计划在调用回调之前加载所有必需的子实体.

我的回购看起来像:

public interface IAsyncRepository<T> where T : class
{
    void GetById(int id, Action<T> callback);
    void GetAllFromQuery(Func<MyEntities, IQueryable<Product>> funcquery,
                                             Action<IList<Calculator>> callback)
}

您可以像这样使用repo:

productRepo.GetAllFromQuery(
    x => x.Products.Where(p => p.ID > 5),
    y => Assert.IsTrue(y.Count > 0)); //y is a IList<Product>

你们有什么感想?

问候,
吉迪恩

只是一个快速,袖手旁观的答案.

使用Reactive Extensions for .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();
}

所有返回的observable都将包含单个值,GetAll除外,它们将具有零或更多.

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;
});

就像我说的,脱下袖口. 🙂

相关文章
相关标签/搜索