最近一直在學習MVC的基礎知識,本來想將學習的心得或歷程記錄下來,以作為今后學些成長中的一點啟發,諸多原因,還是時間不夠,自己功底不夠,就想着斷章取義吧,慢慢積累一些想法罷了。
從之前的一段學習視頻和網友的一些源代碼中找到了一些個人見解:關於業務類和實體類的關系,怎樣將業務類和實體類結合實現比較復雜的業務關系。
首先,我現在是從MVC的學習中拋出來的一些因子,如果有更多的見解,歡迎拍磚,吐槽,本人一向是對技術大神致敬的。呵呵
實體類:UserModel
public class User { public int UserID { get; set; } [Required(ErrorMessage = "請輸入用戶名")] [Display(Name = "用戶名")] [StringLength(20, ErrorMessage = "{0}在{2}位至{1}位之間", MinimumLength = 1)] public string UserName { get; set; } [Required(ErrorMessage = "請輸入密碼")] [Display(Name = "密碼")] [DataType(DataType.Password)] [StringLength(20, ErrorMessage = "{0}在{2}位至{1}位之間", MinimumLength = 6)] public string Password { get; set; } [Display(Name = "手機號碼")] [Required(ErrorMessage = "請輸入手機號碼")] [DataType(DataType.PhoneNumber)] public string Phone { get; set; } [Display(Name = "小區")] public string Residential { get; set; } [Display(Name = "樓號")] public string FloorNo { get; set; } [Display(Name = "單元號")] public string UnitNo { get; set; } [Display(Name = "門牌號")] public string DoorplateNo { get; set; } public DateTime? SubmitTime { get; set; } }
業務類:UserReg
public class UserReg:User { [Display(Name = "重復密碼")] [DataType(DataType.Password)] [Compare("Password", ErrorMessage = "密碼與重復密碼必須相同")] public string RePassword { get; set; } [Display(Name = "記住我")] public bool Remember { get; set; } }
其中業務類UserReg繼承了實體類User,當然為了代碼的簡潔性,我利用了繼承方式,當然也可以采用非繼承的方式。
主要實現什么功能呢?相比大家也能看出兩個類的區別了:實體類User用於存儲用戶的基本信息,而UserReg是為了實現用戶的注冊功能,注冊當然有諸多業務上的功能啦,比如類中多處來的字段RePassword 和Remember.
RePassword為了實現界面中密碼兩次相同的確認,Remember為了記住用戶的信息。
界面代碼如下:注冊頁面
@model Demo.Models.UserReg @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>用戶注冊</title> <script src="~/Scripts/jquery-1.5.1.js"></script> <script type="text/javascript"> var App= { refreshCheckCode:function(imgCtr) { $("#" + imgCtr).Attr("src", '/Image/GetCheckCode' + Math.random()); } } </script> </head> <body> @using (Html.BeginForm()) { @Html.LabelFor(user => user.UserName) @Html.TextBoxFor(user => user.UserName) @Html.ValidationMessageFor(user => user.UserName) <br /> @Html.LabelFor(user => user.Password) @Html.PasswordFor(user => user.Password) @Html.ValidationMessageFor(user => user.Password) <br /> @Html.LabelFor(user => user.RePassword) @Html.PasswordFor(user => user.RePassword) @Html.ValidationMessageFor(user => user.RePassword) <br /> @Html.LabelFor(user => user.Phone) @Html.TextBoxFor(user => user.Phone) @Html.ValidationMessageFor(user => user.Phone) <br /> @Html.LabelFor(user => user.Residential) @Html.DropDownListFor(user => user.Residential, (SelectList)ViewBag.Residential) @Html.LabelFor(user => user.UnitNo) @Html.DropDownListFor(user => user.UnitNo, (SelectList)ViewBag.UnitNo) @Html.LabelFor(user => user.FloorNo) @Html.DropDownListFor(user => user.FloorNo, (SelectList)ViewBag.FloorNo) @Html.LabelFor(user => user.DoorplateNo) @Html.DropDownListFor(user => user.DoorplateNo, (SelectList)ViewBag.DoorplateNo) <br /> <input type="text" name="checkCode" /> <img id="check_img" alt="驗證碼" src="/Image/GetCheckCode/" height="30" width="80" onclick="App.refreshCheckCode('check_img')" /><span><a href="javascript:App.refreshCheckCode('check_img');">換一換</a></span> <br /> <input type="submit" value="注冊" /><a href="/User/Login/">登陸</a> } </body> </html>
顯示情況如下:

問題來了,比如:用戶名,密碼,重復密碼等都是從類中獲取的信息,若是只用實體類,則”重復密碼” 不能有相同的方式實現了,只能是固定文字:即
<span>重復密碼:</span>,那么界面的變動顯得不那
么靈活,都需要到界面來調整,從[Display(Name = "重復密碼")]實現就變得困難了。當然
我這種比喻(例子)顯得不那么好,相同的道理,為了折中折中實現業務的需求,而實體類又缺少對應的字段,怎么辦?業務類可以考慮。
將業務類作為實體傳輸的媒介:見代碼截圖

總之:實體類實現對數據的操作,而業務類實現對業務上的操作。兩者在運用上會有出現相同字段的情況,那么可以考慮通過轉換來實現。
下面我列舉了類似的情況,可以參考下:
//實體類 public class UserMode { public string UserName {get;set;} public string Password{get;set;} public string Gender{get;set;} public string Age{get;set;} public DateTime SubTime{get;set;} } //登錄類 public class UserLogin { public string UserName{get;set;} public string Password{get;set;} public int Remember{get;set;} } //注冊類 public class UserReg { public string UserName{get;set;} public string Password{get;set;} public string Gender{get;set;} public string Age{get;set;} public int Remember{get;set;} public DateTime SubTime{get;set;} }
有人可能胡說這么復雜,我一般都只用一個類就解決問題了。我只想說這是一個思路,有時候一個類是無法解決我們想要的業務邏輯的,那么多個類:從實體到業務,可以解決很多看似很復雜的邏輯,后期維護也很簡單清晰。
好了,就說這么多了,各位有其他想法的歡迎拍磚,頭破了不用負責,我抗的起。呵呵呵。
--補充
今天看了一下自己的代碼,突然有了一個新的想法,如下:
//實體類 public class UserMode { public string UserName {get;set;} public string Password{get;set;} public string Gender{get;set;} public string Age{get;set;} public DateTime SubTime{get;set;} } //登錄類 public class UserLogin:UserModel { //public string UserName{get;set;} //public string Password{get;set;} public int Remember{get;set;} } //注冊類 public class UserReg:UserModel { //public string UserName{get;set;} //public string Password{get;set;} //public string Gender{get;set;} //public string Age{get;set;} public int Remember{get;set;} //public DateTime SubTime{get;set;} }
那么業務類與實體類的轉化就簡單多了
public ActionResult Regedit(Models.UserReg userReg, FormCollection form) { Demo.BLL.AddressBLL addressBll = new Demo.BLL.AddressBLL(); Demo.BLL.UserBLL userBll = new Demo.BLL.UserBLL(); AddressHelper addressHelper = AddressHelper.GetInstance(); addressHelper.GetResidentialItem(addressBll.GetList()); ViewBag.Residential = addressHelper.ResidentialList; ViewBag.FloorNo = addressHelper.FloorNoList; ViewBag.UnitNo = addressHelper.UnitNoList; ViewBag.DoorplateNo = addressHelper.DoorplateNoList; if (form["CheckCode"] != null && form["CheckCode"].ToString() == Session["CheckCode"].ToString()) { if (ModelState.IsValid) { //Models.User user = new Models.User() //{ // UserID = userReg.UserID, // UserName = userReg.UserName, // Password = userReg.Password, // FloorNo = userReg.FloorNo, // Phone = userReg.Phone, // DoorplateNo = userReg.DoorplateNo, // Residential = userReg.RePassword //}; Models.User user = userReg; userBll.Add(user); MessageBox.ShowAndRedirect(this, "注冊成功,請登錄!", "/User/Login"); } } else { MessageBox.Show(this, "驗證碼錯誤!"); } return View(); }
上面代碼可以采用繼承方式 直接:Models.User user=userReg;或者登錄頁有:Models.User user=userLogin;
是不是一下解決了賦值轉化的難題了呢!
