最近一直在学习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;}用户注册 @using (Html.BeginForm()) { @Html.LabelFor(user => user.UserName) @Html.TextBoxFor(user => user.UserName) @Html.ValidationMessageFor(user => user.UserName) @Html.LabelFor(user => user.Password) @Html.PasswordFor(user => user.Password) @Html.ValidationMessageFor(user => user.Password) @Html.LabelFor(user => user.RePassword) @Html.PasswordFor(user => user.RePassword) @Html.ValidationMessageFor(user => user.RePassword) @Html.LabelFor(user => user.Phone) @Html.TextBoxFor(user => user.Phone) @Html.ValidationMessageFor(user => user.Phone) @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)换一换 登陆 }
显示情况如下:
问题来了,比如:用户名,密码,重复密码等都是从类中获取的信息,若是只用实体类,则”重复密码” 不能有相同的方式实现了,只能是固定文字:即
<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;
是不是一下解决了赋值转化的难题了呢!