項目架構開發:展現層(下)


上一章我們完成了項目的展現層的一個表的CURD,從此UI層到數據庫的通道打通了;傳送門:項目架構開發:展現層(上)

這章我們還是講CURD,不過內容重復的話就沒意思了,這次我們想辦法提高代碼編寫的效率;

先來看看從UI層到DataAccess一共要寫多少個類文件,服務層就先不算在里邊了

 

1、DataAccess Layer

這部分是一次性的工作,完成后之后幾乎不用修改,所以這個關系不大

 

2、Business Logic Layer

業務邏輯層有8個類需要寫,以LoginUser舉例

分別是:

1. LoginUser.cs

2. ILoginUserRepository.cs

3. LoginUserRepository.cs

4. LoginUserApplication.cs

5. ILoginUserApplication.cs

6. LoginUserRequest.cs

7. LoginUserResponse.cs

8. LoginUserApplicationTest.cs

 

3、展現層

9. LoginUserController.cs

10. LoginUserViewModel.cs

11. LoginUser/Index.cshtml

12. LoginUserControllerTest.cs

 

好了,一共12個,如果view及JS分多文件的話可能得有15個左右,要是服務層再加進來,恐怕得有18個左右

 

這不得不說多層架構也實在是夠麻煩的,單單一個表結構的CURD就要寫那么多的類,要是有幾百個表,那工作量簡直不敢想象;汗。。

相反要是普通的三層可能只有5個左右,而實際上按照學校里的教科書那樣,一個不寫也是可以完成的,直接在aspx.cs里邊一個方法搞定;

 

但是既然選擇了多層開發,這種情況肯定得有后續手段能解決掉; 我能想到的就是代碼生成器了,這就是本章的主題

代碼生成器有很多,比較有名的比如李天平的“動軟”,記得剛入行的時候看到“動軟”,崇拜的不行,好像現在還在維護的;

 

但是就是覺得動軟的模板配置不靈活,太重了;后來自己搞了一個比較簡單的代碼生成器,傳送門:代碼生成器

具體就不介紹了,這次主要是演示一些結合代碼生成器批量生產代碼的威力;

因為在上一章我們已經有了上邊12個類的已經運行成功的代碼。所以我們就以這12個文件為模板,批量生成其他表的所有類

連測試類也不放過,因為生成后要單元測試的。

我們開始吧!

 

4、新增模板文件

 

應用邏輯類:{0}Application.cs

 1 using Business.DTO.Request;
 2 using Business.DTO.Response;
 3 using Business.ReverseDDD.IRepository;
 4 using Business.ReverseDDD.Model;
 5 using Business.ReverseDDD.Repository;
 6 using Infrastructure.Common;
 7 using Infrastructure.Data.UnitOfWork;
 8 using Infrastructure.Interface;
 9 using System;
10 using System.Collections.Generic;
11 using System.Linq;
12 using System.Linq.Expressions;
13 using Business.ReverseDDD.IApplication;
14 
15 namespace Business.ReverseDDD.Application
16 {
17     public class ${ClassName}Application : I${ClassName}Application
18     {
19         private IUnitOfWork<${ClassName}> unitOfWork;
20         private I${ClassName}Repository repository;
21 
22         public ${ClassName}Application()
23         {
24             this.unitOfWork = new UnitOfWork<${ClassName}>();
25             this.repository = new ${ClassName}Repository(this.unitOfWork);
26         }
27 
28         public bool Add(${ClassName}CURequest entity)
29         {
30             this.repository.Add(new ${ClassName}()
31             {
32 #foreach($Column in $ColumnList)
33 #if(${Column.StandardText}!="CreateTime")
34                 ${Column.StandardText} = entity.${Column.StandardText},
35 #end
36 #end
37                 CreateTime = DateTime.Now
38             });
39             this.unitOfWork.Commit();
40 
41             return true;
42         }
43 
44         public bool Update(${ClassName}CURequest entity)
45         {
46             var tmp = this.repository.Get(entity.Id);
47             if (tmp != null)
48             {
49 #foreach($Column in $ColumnList)
50 #if(${Column.StandardText}!="CreateTime")
51                 tmp.${Column.StandardText} = entity.${Column.StandardText};
52 #end
53 #end
54                 this.repository.Update(tmp);
55 
56                 this.unitOfWork.Commit();
57                 return true;
58             }
59 
60             return false;
61         }
62 
63         public bool Delete(Guid Id)
64         {
65             this.repository.Delete(Id);
66             this.unitOfWork.Commit();
67 
68             return true;
69         }
70 
71         public ${ClassName} Get(Guid Id)
72         {
73             return this.repository.Get(Id);
74         }
75 
76         public Tuple<int, IEnumerable<${ClassName}>> GetPage(Page page, Expression<Func<${ClassName}, bool>> order, Expression<Func<${ClassName}, bool>> where = null)
77         {
78             return this.repository.GetPage(page, order, where);
79         }
80     }
81 }

實體類:{0}.cs

 1 using System;
 2 using Infrastructure.Common;
 3 using System.ComponentModel.DataAnnotations;
 4 
 5 namespace Business.ReverseDDD.Model
 6 {
 7     public class ${ClassName} 
 8     {
 9         [Required]
10         [IgnoreProperty(true)]
11         public int RowNumber { get; set; }
12 
13 #foreach($Column in $ColumnList)
14 #if($Column.StandardType == "string")
15         /// <summary>${Column.Description}</summary>
16         public string ${Column.StandardText} { get; set; }
17 
18 #else
19 #if(${Column.StandardText}!="Id")
20         /// <summary>${Column.Description}</summary>    
21         public $Column.StandardType? ${Column.StandardText} { get; set; }
22 
23 #else
24         /// <summary>${Column.Description}</summary>
25         public $Column.StandardType ${Column.StandardText} { get; set; }
26 
27 #end
28 #end
29 #end
30     }
31 }

 

可以看到,所有類名都被{類名}替換掉了,而且支持循環字段,如這個:#foreach($Column in $ColumnList)

以及if語法,如這個:#if(${Column.StandardText}!="CreateTime")

 

5、我們把所有表需要生成模板批量導出來

 

好了,把文件拷貝進項目中

6、編譯文件、運行單元測試

一個ERROR都沒有,當然設置模板時要細心

103個測試用例全部通過,這初步保證了代碼質量;

 

 7、預覽UI界面

 

都運行正常,期間一句都沒改過哦;當然有些細節肯定要調整的,比如在VIEW視圖共性可能不多,很多細節可能需要調整

但是其他層都保證的CURD及GetPage、GetList,這已經完成了至少70%的代碼,這真正做到了把主要經歷放在業務邏輯層了

老板再也不用擔心我的速度問題,so easy!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM