新聞中心
花了兩天,整理了一下三層架構(gòu),順便練了一個(gè)小型三層架構(gòu)——工程報(bào)價(jià)系統(tǒng)。

10年積累的網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)制作后付款的網(wǎng)站建設(shè)流程,更有鳳慶免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
功能很簡(jiǎn)單,完成基本的增刪改查
- 搭建項(xiàng)目三層結(jié)構(gòu)
- 界面的設(shè)計(jì)以及美化
#p#
- 分層代碼的設(shè)計(jì)與實(shí)現(xiàn)
1.模型層:由于表設(shè)計(jì)時(shí)存在主外鍵關(guān)系,故把表映射成對(duì)象時(shí)添加一個(gè)外鍵對(duì)象來(lái)保存外鍵那張表的相關(guān)數(shù)據(jù)。
- // 外鍵實(shí)體
- private Product _product;
- private Project _project;
- public Project _Project
- {
- get { return _project; }
- set { _project = value; }
- }
- public Product _Product
- {
- get { return _product; }
- set { _product = value; }
- }
2.數(shù)據(jù)訪(fǎng)問(wèn)層:把數(shù)據(jù)封裝成Model對(duì)象的各層之間傳遞。
我個(gè)人不喜歡三層之間傳遞DataSet數(shù)據(jù)集,我的理解是盡量不在BLL層出現(xiàn)DataSet,所以我在DAL層把所有獲取的數(shù)據(jù)封裝成IEnumerable集合,然后返回。
- protected IEnumerable
ToModelsByFK(SqlDataReader reader) - {
- var list = new List
(); - while (reader.Read())
- {
- list.Add(ToModelByFK(reader));
- }
- return list;
- }
- public ProjectItem ToModelByFK(SqlDataReader reader)
- {
- ProjectItem projectItem = new ProjectItem();
- projectItem._Product = new Product();
- projectItem._Project = new Project();
- projectItem.ID = (int)ToModelValue(reader, "ID");
- projectItem._Product.ID = (int)ToModelValue(reader, "ProductID");
- projectItem._Project.ID = (int)ToModelValue(reader,"projectID");
- projectItem._Product.Manufacturer = ToModelValue(reader, "Manufacturer").ToString();
- projectItem._Product.Parameters = ToModelValue(reader, "Parameters").ToString();
- projectItem._Product.Price = decimal.Parse( ToModelValue(reader, "Price").ToString());
- projectItem._Product.ProductName = ToModelValue(reader, "ProductName").ToString();
- projectItem._Product.Specification = ToModelValue(reader, "Specification").ToString();
- projectItem._Product.Unit = ToModelValue(reader, "Unit").ToString();
- projectItem.Count = (int)ToModelValue(reader, "Count");
- projectItem.TotalMoney = (decimal)ToModelValue(reader, "TotalMoney");
- projectItem.UnitPrice = (decimal)ToModelValue(reader, "UnitPrice");
- return projectItem;
- }
- protected object ToModelValue(SqlDataReader reader,string columnName)
- {
- if(reader.IsDBNull(reader.GetOrdinal(columnName)))
- {
- return null;
- }
- else
- {
- return reader[columnName];
- }
- }
使用GetProjectByCondition方法返回一個(gè)封裝成對(duì)象的 IEnumerable集合
- public IEnumerable
GetProjectByCondition(string projectName, string customerName, string contract, string tel) - {
- StringBuilder sqlWhere = new StringBuilder("select * from Project where 1=1");
- List
listParameters = new List (); - if (!string.IsNullOrWhiteSpace(projectName))
- {
- sqlWhere.AppendLine(" and projectName like @projectName");
- listParameters.Add(new SqlParameter("projectName", "%" + projectName + "%"));
- }
- if (!string.IsNullOrWhiteSpace(contract))
- {
- sqlWhere.AppendLine(" and Contact like @Contact");
- listParameters.Add(new SqlParameter("Contact", "%" + contract + "%"));
- }
- if (!string.IsNullOrWhiteSpace(customerName))
- {
- sqlWhere.AppendLine(" and customer like @customer");
- listParameters.Add(new SqlParameter("customer", "%" + customerName + "%"));
- }
- if (!string.IsNullOrWhiteSpace(tel))
- {
- sqlWhere.AppendLine(" and tel like @tel");
- listParameters.Add(new SqlParameter("tel", "%" + tel + "%"));
- }
- using (SqlDataReader reader = SqlHelper.ExecuteDataReader(sqlWhere.ToString(), listParameters.ToArray()))
- {
- return ToModels(reader);
- }
- }
UpdatePassChecked方法接受一個(gè)對(duì)象,通過(guò)對(duì)象的屬性來(lái)獲取數(shù)據(jù)
- public int UpdatePassChecked(ProjectItem projectItem)
- {
- string sql =
- "UPDATE Project " +
- "SET " +
- " ProjectName = @ProjectName"
- + ", Customer = @Customer"
- + ", Contact = @Contact"
- + ", Tel = @Tel"
- + ", DeliveryPlace = @DeliveryPlace"
- + ", DeliveryTime = @DeliveryTime"
- + ", TransportCosts = @TransportCosts"
- + ", PaymentTerm = @PaymentTerm"
- + ", Bak = @Bak"
- + " WHERE ID = @ID";
- SqlParameter[] para = new SqlParameter[]
- {
- new SqlParameter("@ID", projectItem._Project.ID)
- ,new SqlParameter("@ProjectName", ToDBValue(projectItem._Project.ProjectName))
- ,new SqlParameter("@Customer", ToDBValue(projectItem._Project.Customer))
- ,new SqlParameter("@Contact", ToDBValue(projectItem._Project.Contact))
- ,new SqlParameter("@Tel", ToDBValue(projectItem._Project.Tel))
- ,new SqlParameter("@DeliveryPlace", ToDBValue(projectItem._Project.DeliveryPlace))
- ,new SqlParameter("@DeliveryTime", ToDBValue(projectItem._Project.DeliveryTime))
- ,new SqlParameter("@TransportCosts", ToDBValue(projectItem._Project.TransportCosts))
- ,new SqlParameter("@PaymentTerm", ToDBValue(projectItem._Project.PaymentTerm))
- ,new SqlParameter("@Bak", ToDBValue(projectItem._Project.Bak))
- };
- return SqlHelper.ExecuteNonQuery(sql, para);
- }
Add方法傳入一個(gè)已經(jīng)把數(shù)據(jù)封裝好的對(duì)象,然后返回一個(gè)新的對(duì)象(包含新創(chuàng)建生成的ID)
- public Product Add(Product product)
- {
- string sql ="INSERT INTO Product (ProductName, Specification, Manufacturer, Parameters, Price, Unit) output inserted.ID VALUES (@ProductName, @Specification, @Manufacturer, @Parameters, @Price, @Unit)";
- SqlParameter[] para = new SqlParameter[]
- {
- new SqlParameter("@ProductName", ToDBValue(product.ProductName)),
- new SqlParameter("@Specification", ToDBValue(product.Specification)),
- new SqlParameter("@Manufacturer", ToDBValue(product.Manufacturer)),
- new SqlParameter("@Parameters", ToDBValue(product.Parameters)),
- new SqlParameter("@Price", ToDBValue(product.Price)),
- new SqlParameter("@Unit", ToDBValue(product.Unit)),
- };
- int newId = (int)SqlHelper.ExecuteScalar(sql, para);
- return GetByID(newId);
- }
#p#
3.業(yè)務(wù)邏輯層:業(yè)務(wù)邏輯層是項(xiàng)目的核心,業(yè)務(wù)邏輯上的代碼通常在這兒實(shí)現(xiàn)(一言難盡)。
簡(jiǎn)單數(shù)據(jù)驗(yàn)證:
- public bool UpdateThroughChecked(ProjectItem projectItem)
- {
- if (string.IsNullOrEmpty(projectItem._Project.ProjectName))
- {
- throw new Exception("項(xiàng)目名稱(chēng)不能為空");
- }
- //顧客姓名可以為空,但聯(lián)系人不能為空,所以數(shù)據(jù)庫(kù)里就應(yīng)該設(shè)計(jì)好
- if (string.IsNullOrEmpty(projectItem._Project.Contact))
- {
- throw new Exception("聯(lián)系人姓名不能為空");
- }
- if (string.IsNullOrEmpty(projectItem._Project.Tel))
- {
- throw new Exception("聯(lián)系電話(huà)不能為空");
- }
- if (string.IsNullOrEmpty(projectItem._Project.DeliveryPlace))
- {
- throw new Exception("交貨地點(diǎn)不能為空");
- }
- if (string.IsNullOrEmpty(projectItem._Project.DeliveryTime))
- {
- throw new Exception("交貨時(shí)間不能為空");
- }
- if (projectItem._Project.TransportCosts<00)
- {
- throw new Exception("運(yùn)輸費(fèi)用不能為負(fù)數(shù)");
- }
- return new DAL.ProjectItemService().UpdatePassChecked(projectItem) > 0;
- }
計(jì)算總金額:
- public decimal GetProductTotalMoney(int projectID)
- {
- var list = new DAL.ProjectItemService().GetProductTotalMoney(projectID);
- decimal totalMoney = 0.00M;
- foreach (var model in list)
- {
- totalMoney+=model.TotalMoney.Value;
- }
- return totalMoney;
- }
根據(jù)查詢(xún)條件獲取數(shù)據(jù)集合:
- ///
- /// 根據(jù)查詢(xún)條件獲取數(shù)據(jù)集合
- ///
- ///
- ///
- public IEnumerable
GetProductsByCondition(string condition) - {
- return new DAL.ProductService().GetProductsByCondition(condition);
- }
根據(jù)ProjectItemID獲取一條記錄(封裝成對(duì)象)
- public Model.ProjectItem GetOneProjectItemByID(int ProjectItemID)
- {
- return new DAL.ProjectItemService().GetOneProjectItemByID(ProjectItemID);
- }
增加一條記錄:
- ///
- /// 新增一條記錄 根據(jù)條件
- ///
- ///
- ///
- public Model.Project AddPassCheckd(Model.Project modelProject)
- {
- if (string.IsNullOrEmpty(modelProject.ProjectName))
- {
- throw new Exception("項(xiàng)目名稱(chēng)不能為空");
- }
- if (string.IsNullOrEmpty(modelProject.Customer))
- {
- throw new Exception("顧客名稱(chēng)不能為空");
- }
- if (string.IsNullOrEmpty(modelProject.Tel))
- {
- throw new Exception("聯(lián)系電話(huà)不能為空");
- }
- if (modelProject.TransportCosts <= 0)
- {
- throw new Exception("運(yùn)輸費(fèi)用不能為負(fù)數(shù):(");
- }
- return new DAL.ProjectService().Add(modelProject);
- }
刪除一個(gè)項(xiàng)目:
- ///
- /// 刪除一個(gè)項(xiàng)目
- ///
- ///
- ///
- public bool DeleteProject(int projectID)
- {
- bool isSucceed= new BLL.ProjectItemManager().DeleteProjectItemsByProjectID(projectID);
- isSucceed = new DAL.ProjectService().DeleteByID(projectID) > 0 && isSucceed;
- return isSucceed;
- }
4.表現(xiàn)層(UI)
簡(jiǎn)單的窗體里嵌套窗體:
- public void LoadProjectListForm()
- {
- projectListForm = null;
- if (projectListForm==null)
- {
- projectListForm = new ProjectListForm();
- }
- //去掉邊框
- projectListForm.FormBorderStyle = FormBorderStyle.None;
- projectListForm.TopLevel = false;//窗體是否是頂級(jí)窗體
- projectListForm.Dock = DockStyle.Fill;//填充
- projectListForm.Show();//不寫(xiě)看不到
- panelContainer.Controls.Clear();//清空
- panelContainer.Controls.Add(projectListForm);
- }
綁定數(shù)據(jù):
| 我原先思路是直接在DataGridView里綁定對(duì)象的屬性,和GridView一樣使用,但一直無(wú)法綁上去,哪兒錯(cuò)了? |
|
所以只能曲線(xiàn)救國(guó)了:
|
5.項(xiàng)目總結(jié)
花了一個(gè)周末修修補(bǔ)補(bǔ)完成了這個(gè)工程報(bào)價(jià)系統(tǒng),算是復(fù)習(xí)了一把三層架構(gòu)。
如果有需要這個(gè)項(xiàng)目的朋友可以留下郵箱,我發(fā)給你,不算很專(zhuān)業(yè),湊合著參考下~~
| 沒(méi)想到這么多朋友要我的源碼,我很感動(dòng)。附件我就不傳了,我也怕誤導(dǎo)新人。有需要的朋友可以留下郵箱,大家一起探討,我的代碼純當(dāng)入門(mén)階段,是我個(gè)人對(duì)三層架構(gòu)的理解,不足之處,也請(qǐng)多多包涵,提個(gè)意見(jiàn),希望與君互勉。想要更深刻探索我推介《ASP.NET 設(shè)計(jì)模式》 |
本文名稱(chēng):兩天完成一個(gè)小型工程報(bào)價(jià)系統(tǒng)(三層架構(gòu))
分享鏈接:http://www.fisionsoft.com.cn/article/djegjcc.html


咨詢(xún)
建站咨詢(xún)
