关于mvvm中的模型设计
本文关键字:模型 mvvm 关于 | 更新日期: 2023-09-27 18:12:19
当我在学习MVVM时,我在微软虚拟学院看到了一个在线课程,Ben Riga写了下面的代码。我想知道的是下面的问题:
使用名为IDataService的接口有什么好处?在模型类的方法或视图模型类中获取数据将导致更少的代码。肯定有什么我不知道的未来利益。有人能给我解释一下吗?
模型:
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);
}
}
ViewModel:
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;
});
}
}
首先像往常一样在MVVM你不需要做什么,这是一个建议或最佳实践。一般来说,您可以自由地将数据访问编码到视图模型中——对于小型项目或原型实现来说,这样做可能是一个很好的实践。
但是,您应该考虑到这也有一些缺点。实现数据服务的原因是该组件是可重用的,甚至可以在MVC应用程序等其他场景中使用。此外,它将从数据存储中获取模型的关注点分离出来。
实现IDataService的原因是你可以在需要的时候交换实现,例如提供设计时的数据。当需要这样做时,还必须考虑严重依赖接口的控制反转模式。在这种情况下,IOC容器也可能很有趣,尽管不是必需的。
但是,首先以上是建议、模式、设计指南和最佳实践,它们使您可以自由地设计最适合您需求的应用程序。
编辑:数据服务的大小
数据服务的设计和范围取决于你的应用程序和它的需求。它可以为所有模型提供单个数据服务,也可以为每个模型提供一个数据服务。此外,数据服务接口的设计可能是一个单独的决策。一个服务类可以实现多个服务接口,从而允许对用户隐藏实现的某些方面(方法)。
在设计数据服务时,您应该研究工作单元和存储库模式。这里有几个示例实现。
如果你只需要一个基于单个查询的非常简单的工作单元模式,你可以看看我的博客,我在那里写了关于将IQueryable转换为工作单元模式的文章。然而,这只适用于非常简单的情况,通常使用存储库和适当的工作项单元的完整实现更为明智。
我认为IDataService的目标就像一个典型的接口:创建一个分离定义和实现的层,这样你就可以在需要时更改DataService类,而不需要更改使用它的逻辑。