关于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中的模型设计

首先像往常一样在MVVM你不需要做什么,这是一个建议或最佳实践。一般来说,您可以自由地将数据访问编码到视图模型中——对于小型项目或原型实现来说,这样做可能是一个很好的实践。

但是,您应该考虑到这也有一些缺点。实现数据服务的原因是该组件是可重用的,甚至可以在MVC应用程序等其他场景中使用。此外,它将从数据存储中获取模型的关注点分离出来。

实现IDataService的原因是你可以在需要的时候交换实现,例如提供设计时的数据。当需要这样做时,还必须考虑严重依赖接口的控制反转模式。在这种情况下,IOC容器也可能很有趣,尽管不是必需的。

但是,首先以上是建议、模式、设计指南和最佳实践,它们使您可以自由地设计最适合您需求的应用程序。

编辑:数据服务的大小

数据服务的设计和范围取决于你的应用程序和它的需求。它可以为所有模型提供单个数据服务,也可以为每个模型提供一个数据服务。此外,数据服务接口的设计可能是一个单独的决策。一个服务类可以实现多个服务接口,从而允许对用户隐藏实现的某些方面(方法)。

在设计数据服务时,您应该研究工作单元和存储库模式。这里有几个示例实现。

如果你只需要一个基于单个查询的非常简单的工作单元模式,你可以看看我的博客,我在那里写了关于将IQueryable转换为工作单元模式的文章。然而,这只适用于非常简单的情况,通常使用存储库和适当的工作项单元的完整实现更为明智。

我认为IDataService的目标就像一个典型的接口:创建一个分离定义和实现的层,这样你就可以在需要时更改DataService类,而不需要更改使用它的逻辑。