WebForm三层框架到MVC的升级

最近项目中,要求将一个已有的三层构架(WebForm)的网站升级到MVC模式,业务变化不大,前台采用Angular.js,后台采用WebService(WebAPI)提供数据服务。源码中没有使用angular.js。BLTest模拟一下BLL,没有写DAL层。

https://files.cnblogs.com/files/SimpleCode/ComicSerivce.zip

原有项目的特点:

1 业务逻辑比较复杂,而且使用时间比较长了,运行已经比较稳定;

2 分层实现的还可以,所有的业务基本上都在BLL层实现了。

如何能够实现代码的重用?从现实上看,界面肯定要重做,也是一个主要任务,这部分主要使用Bootstrap + Angular.js来搞定。BLL层基本不可能动了。这时问题的焦点很明显的就落在如何实现一些通用的WebService接口,使BLL层提供的数据能够通过简洁的步骤提供给前台页面。

如果定义这些通用服务接口,我们可能最先想到的就是门面模式了,然后用AJAX调用后台的服务。大概代码如下:

public object Invoke(string className, string methodName, object[] parameters)
{
   Type t = Type.GetType(spaceName + className);
  object obj = Activator.CreateInstance(t);
  MethodInfo method = t.GetMethod(actionName);
  method.Invoke(t, parameters);

此时会遇到两个问题

1  在以前的程序中基本上都是Dataset或DataTable,而项目中的需要的事Json格式传递数据,这个问题其实很简单,Newtonsoft.Json.DLL已经为我们实现了。

2  参数和返回值的格式,正常开发都是有Model类来做,但是定义Model本身就是一个枯燥乏味的体力活。返回值倒还好说,我们既然用JSON传输数据,那就使用字符串最为返回值好了但是参数没有Model能传递吗?因为在js和C#之间一个最严重的问题就是js是动态语言,我们定义var a = 1,a在传到后台的时候就变成了int64,当然使用了Newtonsoft.Json后,会以字符串返回去,这和以前我们使用int不一样。其他的类型如浮点型,估计也会出现问题。是否应该提供一些信息,指定这写参数的类型?后来觉得这个东西还是应该提供一个后台操作类,让开发人员在调用BLL中的方法前能够有个控制的地方,开发人员在这里除了能够指定参数类型,还可以做些其他的操作。如何操作这个接口呢?其实很简单,再做一个反射就好了。看一下具体的做法

在这里我为参数定义了一个JsonContainer类,里面包含了类型名,方法名和方法参数的信息。

public class JsonContainer
{
  public string className { get; set; }

  public string actionName { get; set; }

     ///这里很重要,参数本身就是名称和值的键值对,所有的参数可以放到一个对象里传到后台,后台直接就可以自动转换成Dictionary的对象了

     ////正式因为要传递对象,所以我在前台ajax使用的事post方式传递参数对象

    ////而且大家应该都知道Dictionary可以用键值找到Value的,在最后赋值是非常有用的。

  public Dictionary<string, object> parameters { get; set; }

      .........

关于参数的再次映射,很简单了,例如,原来有个BLTest,需要做一个新类,BLTestAdapter,然后对应BLTest的方法GetModel,做一个GetModeInvoke。扩展名自己定,最好用相同的扩展名。看下面这段程序:

public object GetObject()
{
Type t = Type.GetType(spaceName + className);
object obj = Activator.CreateInstance(t);
MethodInfo method = t.GetMethod(actionName);

Type tAdapter = Type.GetType(spaceName + className + classExtendName);
object objAdapter = Activator.CreateInstance(tAdapter);
MethodInfo mAdapter = tAdapter.GetMethod(actionName + methodExtendName);

object objResult = mAdapter.Invoke(objAdapter, new object[] { obj, method, parameters });

return objResult;
}

还剩一个问题,我们在aspx.cs调用了多个BLL中的方法呢,也好办啊,每个方法调用对应一个JsonContainer,我们传递一个JsonContainer数组到后台,然后后台返回一个结果数组的json串回来就可以了,很简单吧。

public string PostIntegrited([FromBody]JsonContainer[] containerList);

程序设计的整体思想就是设计一组简单的服务接口,实现前台能够简单的拿到它们所需数据的Model。减少后台开发的工作量。

其实看看程序会更简单。

posted @ 2016-03-20 22:42  Tea  阅读(419)  评论(0)    收藏  举报