Insus.NET较习惯做法,是在程序完成之后,抽一些少时间对写好的代码重新审视。比如这些天写的Web Api的程序来说,发现有很多值得重构代码。


开发ASP.NET MVC程序,与数据相关有关联的一般是在控制器与Entity实体之间。


初步重构是把Api控制器OrdersController.cs的程序移至实体OrderEntity.cs中去:

第一

重构public IEnumerable<Order> Get()方法,

重构Web Api程序(Api Controller和Entity)_Delete


此方法移至Entity:

重构Web Api程序(Api Controller和Entity)_Delete_02

这样一移动,那在控制器的Get()方法,就可以改为:

重构Web Api程序(Api Controller和Entity)_Jquery_03

第二

 重构public void Post(Order o)方法:

重构Web Api程序(Api Controller和Entity)_Delete_04

在实体添加

重构Web Api程序(Api Controller和Entity)_JsonSerializer_05

控制器方法重构之后:

重构Web Api程序(Api Controller和Entity)_Web API_06



第三

重构控制器OrderController另一个方法public void Post(Order o):

重构Web Api程序(Api Controller和Entity)_Jquery_07


把引方法移至实体:

重构Web Api程序(Api Controller和Entity)_JsonSerializer_08

在控制器中的方法被重构之后:

重构Web Api程序(Api Controller和Entity)_Refactoring_09

第四

重构public void Put(Order order)方法,把此方法移至Entity中去,并创建一个新方法,稍作一些小修改:

重构Web Api程序(Api Controller和Entity)_Delete_10

 

在实体OrderEntity中新建的public void Update(Order order, string fileVirtualPath)方法:

重构Web Api程序(Api Controller和Entity)_JsonSerializer_11


 

重构之后,方法体内代码,可使用2句即可,并删除移走的代码:

重构Web Api程序(Api Controller和Entity)_Jquery_12


第五,最后一个需要搬移的是Delete()方法:

重构Web Api程序(Api Controller和Entity)_Web API_13



在实体类中,创建一个全新的Delete()方法:

重构Web Api程序(Api Controller和Entity)_Refactoring_14

 

被重构之后,在控制器看到的Delete()方法,简洁多了。更多的逻辑处理代码不必在控制方法呈现。

重构Web Api程序(Api Controller和Entity)_JsonSerializer_15

 

最后OrderController.cs类别重构好的类,如下,删除注解的代码,下机标记1至标记5就是我们上面所重构过的方法:

重构Web Api程序(Api Controller和Entity)_JsonSerializer_16



现在我们可以关闭OrderControler.cs类,打开OrderEntity类,对这个类进行重构。找到下面三个方法中

public void AppendDataToExistingJsonFile(Order order, string fileVirtualPath)

public void Update(Order order, string fileVirtualPath)

public void Delete(Order order, string fileVirtualPath)


下面的代代码有冗余,如:

重构Web Api程序(Api Controller和Entity)_Jquery_17



把它写成一个私有方法:

重构Web Api程序(Api Controller和Entity)_Web API_18



看到上面代码示例中的红色箭头否,说明三个方法内已经引用了重构好的代码了。

重构Web Api程序(Api Controller和Entity)_Web API_19



接下来我们又发现四个方法

public void PostAndSaveToFile(Order order, string fileVirtualPath)

public void AppendDataToExistingJsonFile(Order order, string fileVirtualPath)

public void Update(Order order, string fileVirtualPath)

 public void Delete(Order order, string fileVirtualPath)

中,下面这段代码是将List<Order>对象写成json文件,它们在这个OrderEntity类中,已经显冗余了:

重构Web Api程序(Api Controller和Entity)_Refactoring_20



写成一个私有方法:

重构Web Api程序(Api Controller和Entity)_Jquery_21



这样四个方法均可以删除冗余部分的代码,引用这个私有的方法即可,不过第一个方法,public void PostAndSaveToFile(Order order, string fileVirtualPath)

引用此方法,有些问题,因为重构好的方法传入的参数是List<Order>,因此需要做些修改,如下:

重构Web Api程序(Api Controller和Entity)_Web API_22



还有

public void AppendDataToExistingJsonFile(Order order, string fileVirtualPath)

public void Update(Order order, string fileVirtualPath)

public void Delete(Order order, string fileVirtualPath)

三个方法中有一个功能是相同的,就是读取Json文件,并转换为List<Order>对象,虽然代码不一相同,但是我们是可以把它写成一个统一的:

重构Web Api程序(Api Controller和Entity)_Delete_23



这样子,三个方法就可以引用此方法:

重构Web Api程序(Api Controller和Entity)_JsonSerializer_24



在Update()和Delete()方法,还有2句,是实现删除文件的功能:


重构Web Api程序(Api Controller和Entity)_Refactoring_25重构Web Api程序(Api Controller和Entity)_Refactoring_26


if (System.IO.File.Exists(newFilePhysicalPath))
{
File.Delete(newFilePhysicalPath);
}

View Code

可以重构写成一个私有方法并对程序重构如下:

重构Web Api程序(Api Controller和Entity)_Web API_27



OK,最后整理一下4个私有方法:

重构Web Api程序(Api Controller和Entity)_Refactoring_28