业务类与实体类的应用

  最近一直在学习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;

是不是一下解决了赋值转化的难题了呢!

posted @ 2016-11-04 14:32  zhaosw  阅读(2493)  评论(0编辑  收藏  举报