自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

兩天完成一個小型工程報價系統(tǒng)(三層架構)

開發(fā) 架構 后端
花了兩天,整理了一下三層架構,順便練了一個小型三層架構——工程報價系統(tǒng)。具體講解了分層代碼的設計與實現(xiàn)。詳細內容請看下文

花了兩天,整理了一下三層架構,順便練了一個小型三層架構——工程報價系統(tǒng)。

功能很簡單,完成基本的增刪改查

  • 搭建項目三層結構

  • 界面的設計以及美化

#p#

  • 分層代碼的設計與實現(xiàn)

1.模型層:由于表設計時存在主外鍵關系,故把表映射成對象時添加一個外鍵對象來保存外鍵那張表的相關數(shù)據(jù)。

  1. // 外鍵實體  
  2.             private Product _product;  
  3.             private Project _project;  
  4.  
  5.             public Project _Project  
  6.             {  
  7.                 get { return _project; }  
  8.                 set { _project = value; }  
  9.             }  
  10.  
  11.             public Product _Product  
  12.             {  
  13.                 get { return _product; }  
  14.                 set { _product = value; }  
  15.             } 

2.數(shù)據(jù)訪問層:把數(shù)據(jù)封裝成Model對象的各層之間傳遞。

我個人不喜歡三層之間傳遞DataSet數(shù)據(jù)集,我的理解是盡量不在BLL層出現(xiàn)DataSet,所以我在DAL層把所有獲取的數(shù)據(jù)封裝成IEnumerable集合,然后返回。

  1. protected IEnumerable<ProjectItem> ToModelsByFK(SqlDataReader reader)  
  2.          {  
  3.              var list = new List<ProjectItem>();  
  4.              while (reader.Read())  
  5.              {  
  6.                  list.Add(ToModelByFK(reader));  
  7.              }  
  8.              return list;  
  9.          } 
  1. public ProjectItem ToModelByFK(SqlDataReader reader)  
  2.          {  
  3.              ProjectItem projectItem = new ProjectItem();  
  4.              projectItem._Product = new Product();  
  5.              projectItem._Project = new Project();  
  6.              projectItem.ID = (int)ToModelValue(reader, "ID");  
  7.              projectItem._Product.ID = (int)ToModelValue(reader, "ProductID");  
  8.              projectItem._Project.ID = (int)ToModelValue(reader,"projectID");  
  9.              projectItem._Product.Manufacturer = ToModelValue(reader, "Manufacturer").ToString();  
  10.              projectItem._Product.Parameters = ToModelValue(reader, "Parameters").ToString();  
  11.              projectItem._Product.Price = decimal.Parse( ToModelValue(reader, "Price").ToString());  
  12.              projectItem._Product.ProductName = ToModelValue(reader, "ProductName").ToString();  
  13.              projectItem._Product.Specification = ToModelValue(reader, "Specification").ToString();  
  14.              projectItem._Product.Unit = ToModelValue(reader, "Unit").ToString();  
  15.              projectItem.Count = (int)ToModelValue(reader, "Count");  
  16.              projectItem.TotalMoney = (decimal)ToModelValue(reader, "TotalMoney");  
  17.              projectItem.UnitPrice = (decimal)ToModelValue(reader, "UnitPrice");   
  18.              return projectItem;  
  19.          } 
  1. protected object ToModelValue(SqlDataReader reader,string columnName)  
  2.         {  
  3.             if(reader.IsDBNull(reader.GetOrdinal(columnName)))  
  4.             {  
  5.                 return null;  
  6.             }  
  7.             else 
  8.             {  
  9.                 return reader[columnName];  
  10.             }  
  11.         } 

使用GetProjectByCondition方法返回一個封裝成對象的 IEnumerable集合

  1. public IEnumerable<Model.Project> GetProjectByCondition(string projectName, string customerName, string contract, string tel)  
  2.         {  
  3.             StringBuilder sqlWhere = new StringBuilder("select * from Project where 1=1");  
  4.             List<SqlParameter> listParameters = new List<SqlParameter>();  
  5.             if (!string.IsNullOrWhiteSpace(projectName))  
  6.             {  
  7.                 sqlWhere.AppendLine(" and projectName like @projectName");  
  8.                 listParameters.Add(new SqlParameter("projectName""%" + projectName + "%"));  
  9.             }  
  10.             if (!string.IsNullOrWhiteSpace(contract))  
  11.             {  
  12.                 sqlWhere.AppendLine(" and Contact like @Contact");  
  13.                 listParameters.Add(new SqlParameter("Contact""%" + contract + "%"));  
  14.             }  
  15.             if (!string.IsNullOrWhiteSpace(customerName))  
  16.             {  
  17.                 sqlWhere.AppendLine(" and customer like @customer");  
  18.                 listParameters.Add(new SqlParameter("customer""%" + customerName + "%"));  
  19.             }  
  20.             if (!string.IsNullOrWhiteSpace(tel))  
  21.             {  
  22.                 sqlWhere.AppendLine(" and tel like @tel");  
  23.                 listParameters.Add(new SqlParameter("tel""%" + tel + "%"));  
  24.             }  
  25.             using (SqlDataReader reader = SqlHelper.ExecuteDataReader(sqlWhere.ToString(), listParameters.ToArray()))  
  26.             {  
  27.                 return ToModels(reader);  
  28.             }  
  29.  
  30.         } 

UpdatePassChecked方法接受一個對象,通過對象的屬性來獲取數(shù)據(jù)

  1. public int UpdatePassChecked(ProjectItem projectItem)  
  2.          {  
  3.              string sql =  
  4.                  "UPDATE Project " +  
  5.                  "SET " +  
  6.              " ProjectName = @ProjectName" 
  7.                  + ", Customer = @Customer" 
  8.                  + ", Contact = @Contact" 
  9.                  + ", Tel = @Tel" 
  10.                  + ", DeliveryPlace = @DeliveryPlace" 
  11.                  + ", DeliveryTime = @DeliveryTime" 
  12.                  + ", TransportCosts = @TransportCosts" 
  13.                  + ", PaymentTerm = @PaymentTerm" 
  14.                  + ", Bak = @Bak" 
  15.  
  16.              + " WHERE ID = @ID";  
  17.  
  18.  
  19.              SqlParameter[] para = new SqlParameter[]  
  20.             {  
  21.                 new SqlParameter("@ID", projectItem._Project.ID)  
  22.                     ,new SqlParameter("@ProjectName", ToDBValue(projectItem._Project.ProjectName))  
  23.                     ,new SqlParameter("@Customer", ToDBValue(projectItem._Project.Customer))  
  24.                     ,new SqlParameter("@Contact", ToDBValue(projectItem._Project.Contact))  
  25.                     ,new SqlParameter("@Tel", ToDBValue(projectItem._Project.Tel))  
  26.                     ,new SqlParameter("@DeliveryPlace", ToDBValue(projectItem._Project.DeliveryPlace))  
  27.                     ,new SqlParameter("@DeliveryTime", ToDBValue(projectItem._Project.DeliveryTime))  
  28.                     ,new SqlParameter("@TransportCosts", ToDBValue(projectItem._Project.TransportCosts))  
  29.                     ,new SqlParameter("@PaymentTerm", ToDBValue(projectItem._Project.PaymentTerm))  
  30.                     ,new SqlParameter("@Bak", ToDBValue(projectItem._Project.Bak))  
  31.             };  
  32.  
  33.              return SqlHelper.ExecuteNonQuery(sql, para);  
  34.  
  35.          } 

Add方法傳入一個已經(jīng)把數(shù)據(jù)封裝好的對象,然后返回一個新的對象(包含新創(chuàng)建生成的ID)

  1. public Product Add(Product product)  
  2.         {  
  3.                 string sql ="INSERT INTO Product (ProductName, Specification, Manufacturer, Parameters, Price, Unit)  output inserted.ID VALUES (@ProductName, @Specification, @Manufacturer, @Parameters, @Price, @Unit)";  
  4.                 SqlParameter[] para = new SqlParameter[]  
  5.                     {  
  6.                         new SqlParameter("@ProductName", ToDBValue(product.ProductName)),  
  7.                         new SqlParameter("@Specification", ToDBValue(product.Specification)),  
  8.                         new SqlParameter("@Manufacturer", ToDBValue(product.Manufacturer)),  
  9.                         new SqlParameter("@Parameters", ToDBValue(product.Parameters)),  
  10.                         new SqlParameter("@Price", ToDBValue(product.Price)),  
  11.                         new SqlParameter("@Unit", ToDBValue(product.Unit)),  
  12.                     };  
  13.                       
  14.                 int newId = (int)SqlHelper.ExecuteScalar(sql, para);  
  15.                 return GetByID(newId);  
  16.         } 

#p#

3.業(yè)務邏輯層:業(yè)務邏輯層是項目的核心,業(yè)務邏輯上的代碼通常在這兒實現(xiàn)(一言難盡)。

簡單數(shù)據(jù)驗證:

  1. public bool UpdateThroughChecked(ProjectItem projectItem)  
  2.         {  
  3.             if (string.IsNullOrEmpty(projectItem._Project.ProjectName))  
  4.             {  
  5.                 throw new Exception("項目名稱不能為空");  
  6.             }  
  7.             //顧客姓名可以為空,但聯(lián)系人不能為空,所以數(shù)據(jù)庫里就應該設計好  
  8.             if (string.IsNullOrEmpty(projectItem._Project.Contact))  
  9.             {  
  10.                 throw new Exception("聯(lián)系人姓名不能為空");  
  11.             }  
  12.             if (string.IsNullOrEmpty(projectItem._Project.Tel))  
  13.             {  
  14.                 throw new Exception("聯(lián)系電話不能為空");  
  15.             }  
  16.             if (string.IsNullOrEmpty(projectItem._Project.DeliveryPlace))  
  17.             {  
  18.                 throw new Exception("交貨地點不能為空");  
  19.             }  
  20.             if (string.IsNullOrEmpty(projectItem._Project.DeliveryTime))  
  21.             {  
  22.                 throw new Exception("交貨時間不能為空");  
  23.             }  
  24.             if (projectItem._Project.TransportCosts<00)  
  25.             {  
  26.                 throw new Exception("運輸費用不能為負數(shù)");  
  27.             }  
  28.             return new DAL.ProjectItemService().UpdatePassChecked(projectItem) > 0;  
  29.  
  30.         } 

計算總金額:

  1. public decimal GetProductTotalMoney(int projectID)  
  2.         {  
  3.             var list = new DAL.ProjectItemService().GetProductTotalMoney(projectID);  
  4.             decimal  totalMoney = 0.00M;  
  5.             foreach (var model in list)  
  6.             {  
  7.                 totalMoney+=model.TotalMoney.Value;  
  8.             }  
  9.             return totalMoney;  
  10.         } 

根據(jù)查詢條件獲取數(shù)據(jù)集合:

  1. /// <summary>  
  2.         /// 根據(jù)查詢條件獲取數(shù)據(jù)集合  
  3.         /// </summary>  
  4.         /// <param name="condition"></param>  
  5.         /// <returns></returns>  
  6.         public IEnumerable<Model.Product> GetProductsByCondition(string condition)  
  7.         {  
  8.            return new DAL.ProductService().GetProductsByCondition(condition);  
  9.          
  10.         } 

根據(jù)ProjectItemID獲取一條記錄(封裝成對象)

  1. public Model.ProjectItem GetOneProjectItemByID(int ProjectItemID)  
  2.         {  
  3.             return new DAL.ProjectItemService().GetOneProjectItemByID(ProjectItemID);  
  4.         } 

增加一條記錄:

  1. /// <summary>  
  2.         /// 新增一條記錄 根據(jù)條件  
  3.         /// </summary>  
  4.         /// <param name="modelProject"></param>  
  5.         /// <returns></returns>  
  6.         public Model.Project AddPassCheckd(Model.Project modelProject)  
  7.         {  
  8.  
  9.             if (string.IsNullOrEmpty(modelProject.ProjectName))  
  10.             {  
  11.                 throw new Exception("項目名稱不能為空");  
  12.             }  
  13.             if (string.IsNullOrEmpty(modelProject.Customer))  
  14.             {  
  15.                 throw new Exception("顧客名稱不能為空");  
  16.             }  
  17.             if (string.IsNullOrEmpty(modelProject.Tel))  
  18.             {  
  19.                 throw new Exception("聯(lián)系電話不能為空");  
  20.             }  
  21.             if (modelProject.TransportCosts <= 0)  
  22.             {  
  23.                 throw new Exception("運輸費用不能為負數(shù):(");  
  24.             }  
  25.             return new DAL.ProjectService().Add(modelProject);  
  26.              
  27.         } 

刪除一個項目:

  1. /// <summary>  
  2.         /// 刪除一個項目  
  3.         /// </summary>  
  4.         /// <param name="projectID"></param>  
  5.         /// <returns></returns>  
  6.         public bool DeleteProject(int projectID)  
  7.         {  
  8.              bool isSucceed=  new BLL.ProjectItemManager().DeleteProjectItemsByProjectID(projectID);  
  9.              isSucceed = new DAL.ProjectService().DeleteByID(projectID) > 0 && isSucceed;  
  10.              return isSucceed;  
  11.         } 

4.表現(xiàn)層(UI)

簡單的窗體里嵌套窗體:

  1. public void LoadProjectListForm()  
  2.         {  
  3.             projectListForm = null;  
  4.             if (projectListForm==null)  
  5.             {  
  6.                 projectListForm = new ProjectListForm();  
  7.             }  
  8.             //去掉邊框  
  9.             projectListForm.FormBorderStyle = FormBorderStyle.None;  
  10.             projectListForm.TopLevel = false;//窗體是否是頂級窗體  
  11.             projectListForm.Dock = DockStyle.Fill;//填充  
  12.             projectListForm.Show();//不寫看不到  
  13.             panelContainer.Controls.Clear();//清空  
  14.             panelContainer.Controls.Add(projectListForm);  
  15.         } 

綁定數(shù)據(jù):

 我原先思路是直接在DataGridView里綁定對象的屬性,和GridView一樣使用,但一直無法綁上去,哪兒錯了?

 

 所以只能曲線救國了:
 

  1. void LoadData()  
  2.         {  
  3.             var list = new BLL.ProjectItemManager().GetAllProducts(projectID);  
  4.             //dataGridViewProjectItems.DataSource = list;//當控件被綁定時無法向其添加Row  
  5.             dataGridViewProjectItems.Rows.Clear();  
  6.             foreach (var model in list)  
  7.             {  
  8.                 int i = dataGridViewProjectItems.Rows.Add();  
  9.                 dataGridViewProjectItems.Rows[i].Cells["idColumn"].Value = model.ID;  
  10.                 dataGridViewProjectItems.Rows[i].Cells["specificationColumn"].Value = model._Product.Specification;  
  11.                 dataGridViewProjectItems.Rows[i].Cells["productNameColumn"].Value = model._Product.ProductName;  
  12.                 dataGridViewProjectItems.Rows[i].Cells["manufacturerColumn"].Value = model._Product.Manufacturer;  
  13.                 dataGridViewProjectItems.Rows[i].Cells["parametersColumn"].Value = model._Product.Parameters;  
  14.                 dataGridViewProjectItems.Rows[i].Cells["productIDColumn"].Value = model._Product.ID;  
  15.                 dataGridViewProjectItems.Rows[i].Cells["totalMoneyColumn"].Value = model.TotalMoney;  
  16.                 dataGridViewProjectItems.Rows[i].Cells["countColumn"].Value = model.Count;  
  17.                 dataGridViewProjectItems.Rows[i].Cells["unitPriceColumn"].Value = model.UnitPrice;  
  18.                 dataGridViewProjectItems.Rows[i].Cells["projectIDColumn"].Value = model._Project.ID;  
  19.             } 

5.項目總結

花了一個周末修修補補完成了這個工程報價系統(tǒng),算是復習了一把三層架構。

如果有需要這個項目的朋友可以留下郵箱,我發(fā)給你,不算很專業(yè),湊合著參考下~~

沒想到這么多朋友要我的源碼,我很感動。附件我就不傳了,我也怕誤導新人。有需要的朋友可以留下郵箱,大家一起探討,我的代碼純當入門階段,是我個人對三層架構的理解,不足之處,也請多多包涵,提個意見,希望與君互勉。想要更深刻探索我推介《ASP.NET 設計模式》

 

原文鏈接:http://www.cnblogs.com/OceanEyes/archive/2012/06/18/project.html

責任編輯:林師授 來源: 博客園
相關推薦

2011-04-19 13:53:41

三層架構

2013-09-22 14:42:55

鮑爾默微軟

2013-01-09 11:00:20

架構開發(fā)三層架構.NET架構

2009-08-26 18:20:42

三層架構

2009-07-28 17:25:14

ASP.NET三層結構

2011-08-08 14:14:03

架構

2012-02-03 09:44:33

.NET

2009-04-30 15:56:50

三層架構MVCMVP

2009-07-28 15:08:50

MVC三層架構實例

2015-07-02 10:57:11

General框架架構開發(fā)

2018-10-31 14:32:53

數(shù)據(jù)中心網(wǎng)絡架構

2016-12-06 15:35:25

2018-03-08 15:30:31

超融合架構傳統(tǒng)三層架構

2010-01-14 13:29:33

三層交換機特性

2015-05-25 15:15:53

浪潮

2012-08-02 11:05:04

系統(tǒng)建模架構

2014-03-13 14:17:05

Android手游速成

2009-05-06 09:40:04

LINQWEB開發(fā)構架

2012-02-07 10:40:13

MVCJava

2010-02-02 14:53:22

點贊
收藏

51CTO技術棧公眾號