【发布时间】:2011-03-18 07:22:05
【问题描述】:
更新 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>
你们觉得呢?
问候, 基甸
【问题讨论】:
-
只是好奇,但为什么不直接使用 WCF RIA 服务并利用它提供的开箱即用的异步加载和关联事件、验证冒泡、带外调用、变更集管理等为 POCO?
-
真的希望我能做到这一点,但是,我已经有一个基于 WCF-Data Services 构建的应用程序,SL 应用程序不是唯一的消费者。主要消费者之一是桌面/WPF应用程序。
-
@nissan 只是想一想在 Entity Framework 4 模型上提供 RIA 服务有多难?它对 WPF 桌面应用程序也有好处吗?
-
创建一个公开实体框架 4 的域服务是轻而易举的事。我没有尝试从 WPF 访问它,但这些人有:stackoverflow.com/questions/2551258/… 您可以通过简单的配置更改轻松地将您的域服务发布到 OData、SOAP 和 JSON。您可能至少想探索一下。
-
@Nissan 谢谢,我会检查一下,也许会在下一个 SL 应用程序中使用它,但在当前应用程序中无法使用,因为它已经编写了很多代码并且需要待更新和重构。
标签: c# silverlight repository-pattern wcf-data-services system.reactive