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。减少后台开发的工作量。
其实看看程序会更简单。
浙公网安备 33010602011771号