【发布时间】:2011-06-22 23:32:39
【问题描述】:
我有一个任务管理应用程序,它当前使用一个类来使用 Linq-to-SQL 访问数据;我想将数据访问移至项目中的单独解决方案。我想这样做的原因是为两件事做准备。首先是创建一个将在数据库“服务器”(它只是一台 win 7 PC)上运行的服务,该服务将定期查询任务并为到期的任务发送电子邮件提醒。其次是更改对 WCF 的数据访问,以便我可以从 WP7 访问任务(一旦它们在 Verizon 上)
返回的任务由绑定到视图模型的许多用户控件定义。目前,iQueryable 是在一系列语句中构建的,这些语句根据数据绑定成员缩小选择范围。然后查询由其他成员排序。一旦我将数据访问移出解决方案,使其无法访问 viewmodels 成员,我将需要传递相对大量的参数,并且我不确定执行此操作的正确方法是什么。我能想到的方法是:
- 只需创建一个包含十几个或更多参数的方法(有人告诉我这是不好的做法)
- 创建一个包含所有参数的对象并传递它(与我的第一个选项似乎没有太大不同)
- 在数据访问解决方案中创建一个类,然后实例化它并设置它的每个属性,然后调用将返回 iQueryable(或 ObservableCollection)的方法,但我读到这种做法“味道不好”
我对 OOP 和 WPF 非常熟悉,这个简单的应用程序是我构建的最复杂的应用程序。我觉得我缺少一个模式或实践,建议?
如何构建查询的示例:
IQueryable<Issue> issuesQuery;
// Will select all items
issuesQuery = from i in db.Issues
select i;
// Filters out pending issues
issuesQuery = issuesQuery.Where(i => i.IssIsPending == showPendingTasks);
// Filters out closed issues if they are not to be shown
if (includeClosedIssues == false) {
issuesQuery = issuesQuery.Where(i => i.IssIsClosed == false);
}
// Filters out Regular Tasks if they are not to be shown
if (showTasks == false) {
issuesQuery = from i in issuesQuery
where i.IssIsOnStatusBoard == true
select i;
}
// More filters are here
// Order the results
issuesQuery = issuesQuery.OrderByDescending(
i => i.IssIsSticky).ThenBy(
i=>!i.IssDueDate.HasValue).ThenBy(
i => i.IssDueDate).ThenBy(
i => i.IssUrgency);
// an iQueryable is returned but is then converted to an ObservableCollection
return issuesQuery;
【问题讨论】:
-
其实第二点(带参数的对象)比较好,因为: 1)你可以添加或删除参数,方法仍然与其他客户端兼容; 2) 可以只设置必要的参数并使用默认值传递对象。但是我还没有理解第 3 点,如果对您来说没有太大的麻烦,您能否提供代码或文章的链接?您还可以查看 WCF 数据服务,但它们并不总是比常见的 WCF 服务更好。
-
在第三种方法中,我将创建一个公共类,其中包含所有参数的成员和一个返回集合的方法。要使用它,您将实例化它,设置所有成员然后调用方法(这将使用成员的值来确定要返回的项目)
-
我几周前刚购买了 John Sharps “Windows Communication Foundation 4”,但由于生日 Kindle 的原因延迟了启动它:) 我目前对此知之甚少
标签: wpf linq-to-sql design-patterns data-access-layer