牛骨文教育服务平台(让学习变的简单)

1)服务代理层

     这里的代码都是系统自动产生的,主要负责代理服务端得方法执行,没什么特别可说的.

2)客户端模型层DynamicDataSource.cs

using System;  
using System.Net;  
using System.Windows;  
using System.Windows.Controls;  
using System.Windows.Documents;  
using System.Windows.Ink;  
using System.Windows.Input;  
using System.Windows.Media;  
using System.Windows.Media.Animation;  
using System.Windows.Shapes;  
using RIAServices.Web;  
using MEntities;  
using System.ServiceModel.DomainServices.Client;  
namespace MAppStructure.Datasource  
{  
   /// <summary>  
   /// 规范化自己的调用参数,目的是将InvokeOperation调用参数转换为  
   /// 自己易于处理的参数形式  
   /// </summary>  
   /// <typeparam name="T"></typeparam>  
   public class InvokeEventArgs<T>  
   {  
       public T Value { get; set; }  
       public string ErrorMsg { get; set; }  
       public object UserState { get; set; }  
       public bool HasError { get; set; }  
   }  
   /// <summary>  
   /// 负责与服务代理层通信,负责调用代理层方法,并将参数转换为客户  
   /// 端易于理解和处理的形式  
   /// </summary>  
   public class DynamicDataSource  
   {  
       public void GetDynamicDataTable(string strSQL, Action<InvokeEventArgs<DynamicDataTable>> CallBack, object UserState)  
       {  
           DynamicDataContext theContext = new DynamicDataContext();  
           theContext.GetDynamicTable(strSQL, op => {  
               CallBack(CreateEventArgs<DynamicDataTable>(op));  
           },UserState);  
       }  
       //这个函数的目的可以将服务调用的错误集中在此进行处理,或者将错误信息转换成客户端比较容易处理的形式。  
       private static InvokeEventArgs<T> CreateEventArgs<T>(InvokeOperation<T> InvokeOp)  
       {  
           InvokeEventArgs<T> theArgs = new InvokeEventArgs<T>();

           if (InvokeOp.HasError == true)  
           {  
               //将错误标志为已处理.  
               InvokeOp.MarkErrorAsHandled();  
               theArgs.HasError = true;  
               //这里的提示方式可以根据自己的需要进行处理  
               theArgs.ErrorMsg = InvokeOp.Error.InnerException.Message;  
           }  
           else  
           {  
               theArgs.HasError = false;  
               theArgs.Value = InvokeOp.Value;  
           }  
           theArgs.UserState = InvokeOp.UserState;  
           return theArgs;  
       }  
   }  
}

这一层的目的就是进行数据及服务的预处理,客户端得缓存也需放在这一层。因为VM层是针对V的,一般情况下很难共用,而M层中的很多服务都可以出现在不同的VM 中,这也是为什么要单独在服务代理层上再加一层的原因,而且这一层可以建立基类,便于控制和扩展。服务代理层是没办法做基类的,因为代码都是动态生成的。