在我学习MVVM的同时,我看到了Microsoft Virtual Academy的在线课程, Ben Riga在下面写了代码。我想知道的是下面的问题:
使用名为IDataService的接口有什么好处?在模型类的方法中或在viewmodel类中获取数据将导致更少的代码。必须有一些我无法解决的未来好处。有人可以帮我解释一下吗?
型号:
public class CommonDataItem
{
public DataItem(string uid)
{
Uid = uid;
}
public string Uid
{
get;
private set;
}
// Other properties ...
}
public interface IDataService
{
void GetItem(Action<CommonDataItem> callback,
string uid);
}
public class DataService : IDataService
{
public void GetItem(Action<CommonDataItem>
callback, string uid)
{
// Retrieve the data from the actual source
// ...
var item = new DataItem(...);
callback(item);
}
}
视图模型:
public class MainViewModel : ViewModelBase
{
private readonly IDataService _dataService;
public const string Title_PropertyName = "Title";
private string _title = string.Empty;
public string Title
{
get { return _title; }
set
{
if (_title == value)
return;
_title = value;
RaisePropertyChanged(Title_PropertyName);
}
}
// Constructor...
public MainViewModel(IDataService dataService)
{
_dataService = dataService;
_dataService.GetData(
(item) =>
{
Title = item.Title;
});
}
}
答案 0 :(得分:0)
我认为IDataService的目标就像一个典型的接口:创建一个分隔定义和实现的层,这样你就可以根据需要更改DataService类,而不需要改变逻辑使用它。
答案 1 :(得分:0)
首先,像 MVVM 一样,你不需要做某事,这是推荐或最佳做法。通常,您可以自由地将数据访问编码到视图模型中 - 这样做对于小型项目或原型实现可能是一种很好的做法。
但是,您应该考虑到这也存在一些缺点。实现数据服务的原因是该组件是可重用的,甚至可能在MVC应用程序等其他场景中可用。此外,它分离了从数据存储中获取模型的顾虑。
实施IDataService的原因是您可以在需要时交换实施,例如用于提供设计时数据。当您需要这个时,您还必须考虑严重依赖于接口的控制模式的反转。在这种情况下,IOC容器也可能很有趣,尽管不是必需的。
但是,首先是上述建议,模式,设计指南和最佳实践,使您可以自由地设计最符合您要求的应用程序。
修改:数据服务的大小
数据服务的设计和范围取决于您的应用程序及其要求。它的范围从所有模型的单一数据服务到每个模型的一个数据服务。此外,数据服务接口的设计可能是一个单独的决定。一个服务类可以实现多个服务接口,从而允许从用户隐藏实现的某些方面(方法)。
在设计数据服务时,您应该查看工作单元和存储库模式。有几个示例实现。
如果您只需要一个基于单个查询的非常简单的工作单元模式,您可以查看我的博客,其中我写了关于将 IQueryable 转换为工作单元模式的文章。但是,这只适用于非常简单的情况,通常是使用存储库和适当的工作单元的完整实现更合适。