适用于 silverlight 4 + WCF 数据服务的 IAsyncRepository 或 IObservableRepository

2024-01-11

Update 2:@Enigmativity 有一个出色的答案。我已经将其实现为IObservableRepository<T>。详细信息在我下面的回答中。


问题:因此,我已经更改了大部分问题(请参阅编辑历史记录),如果有人对我的设计进行评论/验证/呕吐,我会喜欢它。 =)

所以通常我的存储库看起来像这样:

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 是否有意义?)

为了解决子实体问题,我计划加载所有required调用回调之前的子实体。

我的回购协议看起来像:

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

您可以像这样使用存储库:

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

你们有什么感想?

问候, 吉迪恩


只是一个快速、即兴的回答。

怎么样使用.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;
});

就像我说的,即兴的。 :-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

适用于 silverlight 4 + WCF 数据服务的 IAsyncRepository 或 IObservableRepository 的相关文章

随机推荐