我正在考虑在我的 Silverlight 客户端中使用 oData 端点。自然地,我在做 MVVM,我希望项目是好的和“可混合的”(即,在设计模式下,我必须能够干净地使用静态数据而不是 oData 端点。)
现在来解决问题。我想在我的 ViewModel 中使用 DataServiceCollection,因为它允许很好的可绑定集合,而不必担心 BeginExecute/EndExecute 等。
现在,让我们看一些代码。我的模型界面如下所示:
public interface ITasksModel
{
IQueryable<Task> Tasks { get; }
}
该接口的 oData 端点实现:
public class TasksModel : ITasksModel
{
Uri svcUri = new Uri("http://localhost:2404/Services/TasksDataService.svc");
TaskModelContainer _container;
public TasksModel()
{
_container = new TaskModelContainer(svcUri);
}
public IQueryable<Task> Tasks
{
get
{
return _container.TaskSet;
}
}
}
以及“可混合”设计时实现:
public class DesignModeTasksModel : ITasksModel
{
private List<Task> _taskCollection = new List<Task>();
public DesignModeTasksModel()
{
_taskCollection.Add(new Task() { Id = 1, Title = "Task 1" });
_taskCollection.Add(new Task() { Id = 2, Title = "Task 2" });
_taskCollection.Add(new Task() { Id = 3, Title = "Task 3" });
}
public IQueryable<Task> Tasks
{
get {
return _taskCollection.AsQueryable();
}
}
}
但是,当我尝试在 ViewModel 构造函数中使用最后一个时:
public TaskListViewModel(ITasksModel tasksModel)
{
_tasksModel = tasksModel;
_tasks = new DataServiceCollection<Task>();
_tasks.LoadAsync(_tasksModel.Tasks);
}
我得到一个例外:
在 DataServiceCollection 上调用 LoadAsync 方法时,只能提供类型化的 DataServiceQuery 对象。
首先,如果是这样的话,为什么不把LoadAsync的入参写成DataServiceQuery呢?
其次,做我想要完成的事情的“正确”方式是什么?