关于mvvm中的模型设计

时间:2013-05-07 02:50:11

标签: c# silverlight mvvm windows-phone mvvm-light

在我学习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;
                });
    } 
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

首先,像 MVVM 一样,你不需要做某事,这是推荐或最佳做法。通常,您可以自由地将数据访问编码到视图模型中 - 这样做对于小型项目或原型实现可能是一种很好的做法。

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

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

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

修改:数据服务的大小

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

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

如果您只需要一个基于单个查询的非常简单的工作单元模式,您可以查看我的博客,其中我写了关于将 IQueryable 转换为工作单元模式的文章。但是,这只适用于非常简单的情况,通常是使用存储库和适当的工作单元的完整实现更合适。