架構,改善程序復用性的設計~第六講 我的系統結構~將所有可以抽象的項目進行抽象(大結局)


N層架構及各層之間的通訊標准

一 總體結構圖

clip_image001[4]

二 各個模塊的介紹

通用項目模塊Project.Common:它是對所有項目都公開的項目組合,主要提供一個與領域無關的通用功能的代碼庫

clip_image003

核心項目模塊Project.Core:它是針對某種構架方式(如LINQ To SQL作為底層架構)抽象出來的項目組合,它與領域無關

clip_image005[4]

領域項目模塊,它是具體的項目,如XXB項目,它本身也是一個N層架構方式,一般地,它的UI層會繼承我們的Product.Core下的Web.Commons項目,而對應的Entity對應Entity.Commons項目,由於BLL層是針對某種特殊業務領域的,所以在Project.Core里沒有出現BLL層的抽象。

以下是一個Demo項目的結構

clip_image007[4]

三 具體領域模塊各層之間的通訊標准

由於 project.common和project.core是比較穩定的,而且對所有解決方案都是共用的,所以在這里它不是我們討論的重點,我們主要說一下具體領域模塊的各層間的通訊問題

領域模塊總體圖:

       
    clip_image008
   
 

3.1 UI層與BLL層通訊

添加刪除與更新操作統一使用實體類型,如果要返回信息,請使用統一的消息類

1 /// <summary>
2 /// 插入商品
3 /// </summary>
4 VMessage AddProduct(Product entity);

 

而查詢使用統一使用一個字典類型來存儲條件,用一個結構體存儲分頁參數

1 /// <summary>
2 /// 根據條件得到分頁結果集
3 /// </summary>
4 /// <param name="vp"></param>
5 /// <param name="pp"></param>
6 /// <returns></returns>
7 PagedList<Product> GetProduct(VPredication vp, PagingParam pp);

 

3.2 BLL層與DAL層通訊

BLL層將數據進行組合后,調用數據層統一的方法即可,數據層只提供最基礎的GURD操作,涉及到多表插入,查詢的,統一在BLL層進行組合實現。

下面是業務層代碼的實現:

 1 /// <summary>
 2 /// 商品模塊實現
 3 /// </summary>
 4 public class ProductService : ServiceBase, IProductService
 5 {
 6   IProductRepository iProductRepository = null;
 7   public ProductService()
 8  {
 9   iProductRepository = new ProductRepository();
10  }
11 
12 #region IProductService 成¨¦員¡À
13 public Entity.VMessage AddProduct(Entity.Car_Rental.Product entity)
14 {
15 try
16 {
17   iProductRepository.Insert(entity);
18   VMessage.IsComplete = true;
19 }
20 catch (Exception)
21 {
22  // throw; //發布后注釋它¨¹
23  VMessage.IsComplete = false;
24 }
25  return VMessage;
26 }
27 public Entity.PagedList<Entity.Car_Rental.Product> GetProduct(Entity.VPredication vp, Entity.PagingParam pp)
28 {
29   var linq = iProductRepository.GetDetailModel();
30    return new Entity.PagedList<Entity.Car_Rental.Product>(linq, pp.PageIndex, pp.PageSize);
31 }
32 #endregion
33 }

 

四 實體驗證機制

應該是一種前台特殊效果驗證和實體有效性驗證相結合的一種驗證方式,前台驗證一般指JS驗證,可能產生一些用戶體驗比較好的效果,實體驗證多在實體層完成,在進行添加,修改等操作時,需要進行些驗證。

4.1 實體統一基類:

clip_image010clip_image012[4]

在EntityBase類中已經完成了對實體非空的驗證,GetRuleViolations方法將返回驗證失敗的迭代結果集,它是一個虛方法,子類可以根據自己的邏輯去復寫它。IsValid是一個屬性,它在判斷實體驗證時被賦值,為true表示成功,反之,驗證失敗。

對於復合實體,如在前台表單中可以出現多個實體組合的情況,這時,可以使用MVC的那種方法,頁面元素寫在一個ViewModel里,供這個頁面視圖使用,使用.net的attribute 很容易的可以實現屬性的驗證。

clip_image014[4]

在controller層(可能根據業務需要,也會被抽象出來),我們在進行實體添加與修改操作時,需要判斷實體的IsValid,然后再去調用BLL層的方法,一般代碼是這樣:

 1 [HttpPost]
 2 public ActionResult Create(FormCollection collection)
 3 {
 4 News entity = new News();
 5 TryUpdateModel(entity);
 6 entity.CreateDate = DateTime.Now;
 7 entity.UpdateDate = DateTime.Now;
 8 entity.Status = (int)Status.Normal;
 9 if (entity.IsValid)
10 {
11 iNewsRepository.Insert(entity);
12 return AlertToUrl("Index");
13 }
14 else
15 {
16 entity.GetRuleViolations().ToList().ForEach(i =>
17 {
18 ModelState.AddModelError(i.PropertyName, i.ErrorMessage); //驗證沒有通過的信息
19 });
20 }
21 return View();
22 }

 

五 接口的重要性

接口可能會成功我們的累贅,添加了代碼量,(F12)轉到定義時也會帶來不方便,我們是否應該廢棄接口

它的好處:

1 統一,穩定的操作規范

2 使用接口,配和IOC,實現一種操作的多種實現方式的切換

對DAL層接口與實現的抽象圖示

 
  clip_image015


免責聲明!

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



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