• [Silverlight入门系列]使用MVVM模式(8):ViewModel进一步分离出Services


    上一讲中介绍了MVVM的核心概念,运用MVVM模式可以分离视图、视图逻辑和模型,提高可测试性和可维护性等,但如果一个视图比较复杂,仔细Review一下其ViewModel你会发现非常庞大臃肿复杂,而且部分代码逻辑不可重用,例如另外一个ViewModel想重用其中的部分代码逻辑而不是整个重用,就没有办法。所以最好进一步分离ViewModel的关注点,分离出Services实现IServcie接口,让Service去做一些可重用的工作,分离出一些可重用的操作,这样其他的ViewModel就可以用Service来重用ViewModel的部分逻辑了。原来的ViewModel关注点可以聚焦在用户界面交互(绑定)和视图展现逻辑上。下面这个图描述了分离ViewModel关注点的关系:

    201107071659567548

    例如,我们在ViewModel中有一段逻辑是用DomainContext从WCF RIA Service获取数据,现在我们把它分离出去,就叫MyDataService,实现以下接口IMyDataService:

    接口IMyDataService

     1: public interface IMyDataService
     2: {
     3:  void GetMyEntities(Action<ObservableCollection<MyEntity>> getMyEntityCallback);
     4: }

     

    类MyDataService实现以上接口

     1: [Export(typeof(IMyDataService))]
     2: [PartCreationPolicy(CreationPolicy.Shared)]
     3: public class MyDataService : IMyDataService
     4: {
     5:  private MyEntityDomainContext Context { get; set; }
     6:  private LoadOperation<MyEntity> _operation;
     7:  private Action<ObservableCollection<MyEntity>> _getMyEntityCallback;
     8:  
     9:  public MyEntityService()
     10:  {
     11:  Context=new MyEntityDomainContext();
     12:  Context.PropertyChanged += ContextPropertyChanged;
     13:  }
     14:  
     15:  private void ContextPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
     16:  {
     17:  if (NotifyHasChanges != null)
     18:  {
     19:  NotifyHasChanges(this, new HasChangesEventArgs() {HasChanges = Context.HasChanges});
     20:  }
     21:  }
     22:  
     23:  public void GetMyEntitys(Action<ObservableCollection<MyEntity>> getMyEntityCallback)
     24:  {
     25:  _getMyEntityCallback = getMyEntityCallback;
     26:  _operation = Context.Load(Context.GetMyEntityOverviewQuery());
     27:  _operation.Completed += OnLoadMyEntityCompleted;
     28:  }
     29:  
     30:  private void OnLoadMyEntityCompleted(object sender, EventArgs e)
     31:  {
     32:  _operation.Completed -= OnLoadMyEntityCompleted;
     33:  var MyEntitysList = new EntityList<MyEntity>(Context.MyEntitys, _operation.Entities);
     34:  _getMyEntityCallback(MyEntitysList);
     35:  }
     36: }

    实现IDisposable接口释放内存:View,ViewModel,Service

    当你创建一个View,会创建其ViewModel,ViewModel又会创建Service,所以当你关闭View的视图的时候,这些引用还在吗?会不会内存泄露呢?具体如何实现IDisposable接口,如何调用释放内存,请看我的另一篇文章。

    总结

    使用的时候把这个Service用依赖注入(构造注入/属性注入)到ViewModel即可。

    其他的ViewModel可以重用Services,而且Services易于扩展、维护和测试。

    顺便说一下,在Prism框架中,这个Services的概念用到的地方很多,通过ServiceLocator更强,所以一定要用的好。

    Powered By D&J (URL:http://www.cnblogs.com/Areas/)
  • 相关阅读:
    windows下GitHub的SSH Key 配置
    bootdo开源项目修改代码后页面无效
    携程第二场预赛 1003:位图像素的颜色(水题,判断点是否在矩形内)
    hdu 2105:The Center of Gravity(计算几何,求三角形重心)
    《随机出题软件》&《随机分队软件》源码(Windows API)
    hdu 1426:Sudoku Killer(DFS深搜,进阶题目,求数独的解)
    fzu 1330:Center of Gravity(计算几何,求扇形重心)
    hrbustoj 1104:Leyni, LOLI and Line(解析几何,斜截式的应用)
    poj 3348:Cows(计算几何,求凸包面积)
    《linux系统及其编程》实验课记录(五)
  • 原文地址:https://www.cnblogs.com/Areas/p/2169893.html
Copyright © 2020-2023  润新知