业务类与实体类的应用

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

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

转载于:https://www.cnblogs.com/zhaosw/p/6030202.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值