業務類與實體類的應用


  最近一直在學習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;

是不是一下解決了賦值轉化的難題了呢!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM