成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > ASP.NET MVC5 網(wǎng)站開發(fā)框架模型、數(shù)據(jù)存儲、業(yè)務邏輯(三)

ASP.NET MVC5 網(wǎng)站開發(fā)框架模型、數(shù)據(jù)存儲、業(yè)務邏輯(三)

熱門標簽:西寧電銷外呼系統(tǒng)公司 上海市三維地圖標注 辦公用地圖標注網(wǎng)點怎么操作 云南外呼系統(tǒng)代理 聊城智能電銷機器人電話 南昌自動外呼系統(tǒng)線路 安陸市地圖標注app 寧德防封版電銷卡 海東防封電銷卡

前面項目的層次和調用關系都說明了,關系如下圖

采用三層架構的時候,研究過BLL層的必要性,覺得業(yè)務邏輯完全可以在controller里實現(xiàn),沒有必要單獨做一個項目,另一個分層多了會影響性能。后來我還是把業(yè)務邏輯獨立出來,原因如下:

  • 業(yè)務邏輯寫進controller里代碼看著比較混亂,時間久了代碼容易理不清。
  • 在controller里直接寫邏輯重復代碼會不較多,開發(fā)效率低。
  • 分項目有利于代碼重用,有時候可以直接拿到其他項目中稍作修改就可以用。

對于性能我覺得分層多了肯定會有影響,但是不會很大?,F(xiàn)在硬件的更新速度遠大于軟件,對業(yè)務邏輯處理起來很輕松,多實例化幾個類對性能影響不大。一般來說網(wǎng)站運行基本上是一個存數(shù)據(jù)庫和取數(shù)據(jù)庫的過程,業(yè)務邏輯還是比較少,只不過現(xiàn)在的網(wǎng)站使用的圖片、動畫更多,效果更加絢麗。我覺得網(wǎng)站的效率瓶頸主要出現(xiàn)在服務器的帶寬、IO性能和存取數(shù)據(jù)庫上。在代碼方面能做的就是優(yōu)化數(shù)據(jù)庫的存取。對了一般項目來說,為了百分之幾的運行效率遠不如提高開發(fā)效率和更加容易的代碼管理重要,能實現(xiàn)需求就好,運行效率是哪是大牛要做的事。

對IDAL、DAL、IBLL 、BLL這四個項目:

IDAL寫一個Base接口,接口中固定幾個數(shù)據(jù)庫操作方法,其他接口都繼承自這個接口;

DAL項目做個base類實現(xiàn)這個IDAL的base接口,其他類都繼承自base類。

同樣IBLL中也寫一個Base接口,固定幾個基本的操作方法,同樣其他接口也繼承自這個base接口

IBLL中也寫一個base類來實現(xiàn)IBLL中的base接口,其他類繼承自這個base類。

這里以對用戶的操作來構建代碼的基本模式:

一、模型
這里寫三個模型類。打開Ninesk.Models分別添加User、UserGroup、UserConfig三個模型類。

1、用戶模型—User類
用戶模型或者叫賬戶模型,為什么這么說看下面代碼

using System;
using System.ComponentModel.DataAnnotations;

namespace Ninesky.Models
{
 /// summary>
 /// 用戶模型
 /// remarks>
 /// 創(chuàng)建:2014.02.02br />
 /// 修改:2014.02.05
 /// /remarks>
 /// /summary>
 public class User
 {
  [Key]
  public int UserID { get; set; }

  /// summary>
  /// 用戶名
  /// /summary>
  [Required(ErrorMessage="必填")]
  [StringLength(20,MinimumLength=4,ErrorMessage="{1}到{0}個字符")]
  [Display(Name="用戶名")]
  public string UserName { get; set; }

  /// summary>
  /// 用戶組ID
  /// /summary>
  [Required(ErrorMessage = "必填")]
  [Display(Name = "用戶組ID")]
  public int GroupID { get; set; }

  /// summary>
  /// 顯示名
  /// /summary>
  [Required(ErrorMessage = "必填")]
  [StringLength(20, MinimumLength = 2, ErrorMessage = "{1}到{0}個字符")]
  [Display(Name = "顯示名")]
  public string DisplayName { get; set; }

  /// summary>
  /// 密碼
  /// /summary>
  [Required(ErrorMessage = "必填")]
  [Display(Name = "密碼")]
  [DataType(DataType.Password)]
  public string Password { get; set; }

  /// summary>
  /// 郵箱
  /// /summary>
  [Required(ErrorMessage = "必填")]
  [Display(Name = "郵箱")]
  [DataType(DataType.EmailAddress)]
  public string Email { get; set; }

  /// summary>
  /// 用戶狀態(tài)br />
  /// 0正常,1鎖定,2未通過郵件驗證,3未通過管理員
  /// /summary>
  public int Status { get; set; }

  /// summary>
  /// 注冊時間
  /// /summary>
  public DateTime RegistrationTime { get; set; }

  /// summary>
  /// 上次登陸時間
  /// /summary>
  public DateTime LoginTime { get; set; }

  /// summary>
  /// 上次登陸IP
  /// /summary>
  public DateTime LoginIP { get; set; }

  public virtual UserGroup Group { get; set; }

 }
}

這個模型類中只包含用戶名、密碼、用戶組、顯示名、郵箱等屬性,純粹是基本的賬戶信息,目的是讓用戶注冊的時候盡可能的少填信息。其他信息如果需要可以再寫新類與賬戶進行關聯(lián),用戶需要的時候登錄后再進行補填(如:資本資料、個人信息、聯(lián)系方式等。這里先不考慮這些)。這里的顯示名根據(jù)需要可以做昵稱、真實姓名等來使用。

2、用戶組模型—UserGroup類
這個類注意下GroupType,這個用來對用戶組進行一下分類的,方便管理,其實沒什么特別的意義。我的想法是普通類型就放普通的注冊用戶的組,如果大的網(wǎng)站允許用戶升級的話,限定在這個類型的用戶組內(nèi)。特權組可以放一些vip之類的用戶組,需要管理員給予,區(qū)別普通用戶組,但又沒有管理權。管理類型的用戶組需要后臺管理員給予,可以對文章、評論、咨詢進行管理。

using System.ComponentModel.DataAnnotations;

namespace Ninesky.Models
{
 /// summary>
 /// 用戶組
 /// remarks>
 /// 創(chuàng)建:2014.02.02
 /// 修改:2014.02.08
 /// /remarks>
 /// /summary>
 public class UserGroup
 {
  [Key]
  public int GroupID { get; set; }

  /// summary>
  /// 名稱
  /// /summary>
  [Required(ErrorMessage="必填")]
  [StringLength(20, MinimumLength = 2, ErrorMessage = "{1}到{0}個字")]
  [Display(Name="名稱")]
  public string Name { get; set; }

  /// summary>
  /// 用戶組類型br />
  /// 0普通類型(普通注冊用戶),1特權類型(像VIP之類的類型),3管理類型(管理權限的類型)
  /// /summary>
  [Required(ErrorMessage = "必填")]
  [Display(Name = "用戶組類型")]
  public int GroupType { get; set; }

  /// summary>
  /// 說明
  /// /summary>
  [Required(ErrorMessage = "必填")]
  [StringLength(50, ErrorMessage = "少于{0}個字")]
  [Display(Name = "說明")]
  public string Description { get; set; }
 }
}

3、用戶配置模型類—UserConfig類
這個類是一些用戶配置信息(暫時只考慮了注冊設置),在后臺管理員處進行設置。

using System.ComponentModel.DataAnnotations;

namespace Ninesky.Models
{
 /// summary>
 /// 用戶配置
 /// remarks>
 /// 創(chuàng)建:2014.02.06
 /// /remarks>
 /// /summary>
 public class UserConfig
 {
  [Key]
  public int ConfigID { get; set; }

  /// summary>
  /// 啟用注冊
  /// /summary>
  [Display(Name = "啟用注冊")]
  [Required(ErrorMessage="必填")]
  public bool Enabled { get; set; }

  /// summary>
  /// 禁止使用的用戶名br />
  /// 用戶名之間用“|”隔開
  /// /summary>
  [Display(Name = "禁止使用的用戶名")]
  public string ProhibitUserName { get; set; }

  /// summary>
  /// 啟用管理員驗證
  /// /summary>
  [Display(Name = "啟用管理員驗證")]
  [Required(ErrorMessage = "必填")]
  public bool EnableAdminVerify { get; set; }

  /// summary>
  /// 啟用郵件驗證
  /// /summary>
  [Display(Name = "啟用郵件驗證")]
  [Required(ErrorMessage = "必填")]
  public bool EnableEmailVerify { get; set; }

  /// summary>
  /// 默認用戶組Id
  /// /summary>
  [Display(Name = "默認用戶組Id")]
  [Required(ErrorMessage = "必填")]
  public int DefaultGroupId { get; set; }
 }
}

二、數(shù)據(jù)存儲層
數(shù)據(jù)存儲層負責與數(shù)據(jù)庫打交道,由于使用了接口產(chǎn)生了兩個項目DAL和IDAL。IDAL是接口項目,DAL是接口的實現(xiàn)項目。

在與數(shù)據(jù)庫的方便有一些共同的操作,像添加、修改、刪除、查詢等。不想在實際寫代碼的時候在用戶類寫一遍這些東西,用戶組類再寫一遍、以后文章、評論都再重復寫這些代碼。怎么辦,弄個基類。以后其他類從基類繼承就把這些公共方法繼承過來了。

1、IDAL項目
首先打開IDAL項目,添加類InterfaceBaseRepository,代碼如下。

using System;
using System.Linq;
using System.Linq.Expressions;

namespace Ninesky.IDAL
{
 /// summary>
 /// 接口基類
 /// remarks>創(chuàng)建:2014.02.03 br />
 /// 修改:2014.02.09/remarks>
 /// /summary>
 /// typeparam name="T">類型/typeparam>
 public interface InterfaceBaseRepositoryT>
 {
  /// summary>
  /// 添加
  /// /summary>
  /// param name="entity">數(shù)據(jù)實體/param>
  /// returns>添加后的數(shù)據(jù)實體/returns>
  T Add(T entity);

  /// summary>
  /// 查詢記錄數(shù)
  /// /summary>
  /// param name="predicate">條件表達式/param>
  /// returns>記錄數(shù)/returns>
  int Count(ExpressionFuncT, bool>> predicate);

  /// summary>
  /// 更新
  /// /summary>
  /// param name="entity">數(shù)據(jù)實體/param>
  /// returns>是否成功/returns>
  bool Update(T entity);

  /// summary>
  /// 刪除
  /// /summary>
  /// param name="entity">數(shù)據(jù)實體/param>
  /// returns>是否成功/returns>
  bool Delete(T entity);

  /// summary>
  /// 是否存在
  /// /summary>
  /// param name="anyLambda">查詢表達式/param>
  /// returns>布爾值/returns>
  bool Exist(ExpressionFuncT, bool>> anyLambda);

  /// summary>
  /// 查詢數(shù)據(jù)
  /// /summary>
  /// param name="whereLambda">查詢表達式/param>
  /// returns>實體/returns>
  T Find(ExpressionFuncT, bool>> whereLambda);

  /// summary>
  /// 查找數(shù)據(jù)列表
  /// /summary>
  /// typeparam name="S">排序/typeparam>
  /// param name="whereLamdba">查詢表達式/param>
  /// param name="isAsc">是否升序/param>
  /// param name="orderLamdba">排序表達式/param>
  /// returns>/returns>
  IQueryableT> FindListS>(ExpressionFuncT, bool>> whereLamdba, bool isAsc, ExpressionFuncT, S>> orderLamdba);
  
  /// summary>
  /// 查找分頁數(shù)據(jù)列表
  /// /summary>
  /// typeparam name="S">排序/typeparam>
  /// param name="pageIndex">當前頁/param>
  /// param name="pageSize">每頁記錄數(shù)/param>
  /// param name="totalRecord">總記錄數(shù)/param>
  /// param name="whereLamdba">查詢表達式/param>
  /// param name="isAsc">是否升序/param>
  /// param name="orderLamdba">排序表達式/param>
  /// returns>/returns>
  IQueryableT> FindPageListS>(int pageIndex, int pageSize, out int totalRecord, ExpressionFuncT, bool>> whereLamdba, bool isAsc, ExpressionFuncT, S>> orderLamdba);

 }
}

這里定義了增、刪、改、判斷存在、返回模型的查詢、返回集合的查詢,返回分頁集合的查詢7個公共方法。這幾個方法基本滿足一般需要,特殊的方法在繼承的時候再添加。
還使用了泛型,在繼承的時候傳入實體類型就可以直接繼承這些方法了。具體看下InterfaceUserRepository接口就清楚了。

using Ninesky.Models;
namespace Ninesky.IDAL
{
 /// summary>
 /// 用戶接口
 /// remarks>創(chuàng)建:2014.02.03/remarks>
 /// /summary>
 public interface InterfaceUserRepository:InterfaceBaseRepositoryUser>
 {
 }
}

簡單吧,繼承自InterfaceBaseRepository接口并傳入實體類User就行了。我們在類視圖中看下,是不是繼承了基類的接口。

2、DAL項目
DAL項目是對IDAL項目接口的實現(xiàn),項目中要創(chuàng)建DbContext類,對于DbContext類很多人討論過它對數(shù)據(jù)庫存取的效率,MSDN中說其是輕量的, 創(chuàng)建不需要很大開銷,它也不是線程安全的對象,并且具有數(shù)據(jù)容器的性質(跟蹤),因此很多人認為不應該將其靜態(tài)化、單例化。但是對用戶的單次請求來說實現(xiàn)DbContext唯一是合理的。 先看代碼吧,非常簡單。

using Ninesky.Models;
using System.Data.Entity;

namespace Ninesky.DAL
{
 /// summary>
 /// 數(shù)據(jù)上下文
 /// remarks>創(chuàng)建:2014.02.03/remarks>
 /// /summary>
 public class NineskyDbContext:DbContext
 {
  public DbSetUser> Users { get; set; }
  public DbSetUserGroup> UserGroups { get; set; }
  public DbSetUserConfig> UserConfig { get; set; }
  public NineskyDbContext()
   : base("DefaultConnection")
  {
  }
 }
}

下面創(chuàng)建一個BaseRepository類,繼承自InterfaceBaseRepository并實現(xiàn)類其接口的方法。

using Ninesky.IDAL;
using System;
using System.Linq;
using System.Linq.Expressions;

namespace Ninesky.DAL
{
 /// summary>
 /// 倉儲基類
 /// remarks>創(chuàng)建:2014.02.03/remarks>
 /// /summary>
 public class BaseRepositoryT>: InterfaceBaseRepositoryT> where T : class 
 {
  protected NineskyDbContext nContext = ContextFactory.GetCurrentContext();

  public T Add(T entity)
  {
   nContext.EntryT>(entity).State = System.Data.Entity.EntityState.Added;
   nContext.SaveChanges();
   return entity;
  }

  public int Count(ExpressionFuncT, bool>> predicate)
  {
   return nContext.SetT>().Count(predicate);
  }

  public bool Update(T entity)
  {
   nContext.SetT>().Attach(entity);
   nContext.EntryT>(entity).State = System.Data.Entity.EntityState.Modified;
   return nContext.SaveChanges() > 0;
  }

  public bool Delete(T entity)
  {
   nContext.SetT>().Attach(entity);
   nContext.EntryT>(entity).State = System.Data.Entity.EntityState.Deleted;
   return nContext.SaveChanges() > 0;
  }

  public bool Exist(ExpressionFuncT, bool>> anyLambda)
  {
   return nContext.SetT>().Any(anyLambda);
  }

  public T Find(ExpressionFuncT, bool>> whereLambda)
  {
   T _entity = nContext.SetT>().FirstOrDefaultT>(whereLambda);
   return _entity;
  }

  public IQueryableT> FindListS>(ExpressionFuncT, bool>> whereLamdba, bool isAsc, ExpressionFuncT, S>> orderLamdba)
  {
   var _list = nContext.SetT>().WhereT>(whereLamdba);
   if (isAsc) _list = _list.OrderByT, S>(orderLamdba);
   else _list = _list.OrderByDescendingT, S>(orderLamdba);
   return _list;
  }

  public IQueryableT> FindPageListS>(int pageIndex, int pageSize, out int totalRecord, ExpressionFuncT, bool>> whereLamdba, bool isAsc, ExpressionFuncT, S>> orderLamdba)
  {
   var _list = nContext.SetT>().WhereT>(whereLamdba);
   totalRecord = _list.Count();
   if (isAsc) _list = _list.OrderByT, S>(orderLamdba).SkipT>((pageIndex - 1) * pageSize).TakeT>(pageSize);
   else _list = _list.OrderByDescendingT, S>(orderLamdba).SkipT>((pageIndex - 1) * pageSize).TakeT>(pageSize);
   return _list;
  }
 }
}

代碼中都是對數(shù)據(jù)庫的操作。比較有看頭的是這句protected NineskyDbContext nContext = ContextFactory.GetCurrentContext();

ContextFactory是一個簡單工廠類,GetCurrentContext()是一個靜態(tài)函數(shù)。利用簡單工廠獲取請求內(nèi)的當前DbContext,也就是請求內(nèi)的DbContext單例。先添加一個工廠類ContextFactory

using System.Data.Entity;
using System.Runtime.Remoting.Messaging;

namespace Ninesky.DAL
{
 /// summary>
 /// 上下文簡單工廠
 /// remarks>
 /// 創(chuàng)建:2014.02.05
 /// /remarks>
 /// /summary>
 public class ContextFactory
 {

  /// summary>
  /// 獲取當前數(shù)據(jù)上下文
  /// /summary>
  /// returns>/returns>
  public static NineskyDbContext GetCurrentContext()
  {
   NineskyDbContext _nContext = CallContext.GetData("NineskyContext") as NineskyDbContext;
   if (_nContext == null)
   {
    _nContext = new NineskyDbContext();
    CallContext.SetData("NineskyContext", _nContext);
   }
   return _nContext;
  }
 }
}

這里是先在CallContext中獲取NineskyContext,如果為空則初始化一個NineskyContext,如果存在則直接返回??碈allContext,MSDN中講CallContext提供對每個邏輯執(zhí)行線程都唯一的數(shù)據(jù)槽,而在WEB程序里,每一個請求恰巧就是一個邏輯線程所以可以使用CallContext來實現(xiàn)單個請求之內(nèi)的DbContext單例。

下面添加具體的倉儲代碼。

在DAL中再添加一個UserRepository類,繼承自BaseRepository和InterfaceUserRepository。目的是繼承自BaseRepository類,實現(xiàn)InterfaceUserRepositor接口。

using Ninesky.IDAL;
using Ninesky.Models;
using System.Linq;

namespace Ninesky.DAL
{
 /// summary>
 /// 用戶倉庫
 /// remarks>創(chuàng)建:2014.02.03/remarks>
 /// /summary>
 class UserRepository: BaseRepositoryUser>, InterfaceUserRepository
 {
 }
}

UserRepository就直接繼承了基類中的方法,基類中的方法能滿足絕大部分需要,UserRepository就不用再增加函數(shù)了,其他Repository類都類似,不在貼代碼了。

這里我們在建一個Repository工廠,用來返回項目中的所有Repository類。

using Ninesky.IDAL;

namespace Ninesky.DAL
{
 /// summary>
 /// 簡單工廠?
 /// remarks>創(chuàng)建:2014.02.03/remarks>
 /// /summary>
 public static class RepositoryFactory
 {
  /// summary>
  /// 用戶倉儲
  /// /summary>
  public static InterfaceUserRepository UserRepository { get { return new UserRepository(); } }
 }
}

以后在BLL中調用的時候就不用每次都寫InterfaceUserRepository _iUserRsy = new  UserRepository()了,直接寫成InterfaceUserRepository _iUserRsy = RepositoryFactory.UserRepository這個東西的好處就是,以后在DAL項目中實現(xiàn)InterfaceUserRepository接口的類需要修改時我們可以直接創(chuàng)建個新類,然后RepositoryFactory類中讓UserRepository屬性返回新類就行了。

3、IBLL項目
IBLL是業(yè)務邏輯層的接口,業(yè)務邏輯層對數(shù)據(jù)庫的操作上基本還是增、刪、改。同樣寫一個基接口把這三個操作寫進去,這里與IDAL思路類似。

namespace Ninesky.IBLL
{
 /// summary>
 /// 接口基類
 /// remarks>創(chuàng)建:2014.02.03/remarks>
 /// /summary>
 public interface InterfaceBaseServiceT> where T : class
 {
  /// summary>
  /// 添加
  /// /summary>
  /// param name="entity">數(shù)據(jù)實體/param>
  /// returns>添加后的數(shù)據(jù)實體/returns>
  T Add(T entity);

  /// summary>
  /// 更新
  /// /summary>
  /// param name="entity">數(shù)據(jù)實體/param>
  /// returns>是否成功/returns>
  bool Update(T entity);

  /// summary>
  /// 刪除
  /// /summary>
  /// param name="entity">數(shù)據(jù)實體/param>
  /// returns>是否成功/returns>
  bool Delete(T entity);
 }
}


在添加一個InterfaceUserService接口,繼承自InterfaceBaseService。根據(jù)需要在接口中又添加了幾個方法。在這里對Find方法的名稱進行統(tǒng)一,凡是返回實體類的名稱為Find()或FindByXXX(),返回一組數(shù)據(jù)的方法名稱為FindList()或FindXXXList,分頁的名稱格式為FindPageList()或FindxxxPageList()

using Ninesky.Models;
using System.Linq;

namespace Ninesky.IBLL
{
 /// summary>
 /// 用戶相關接口
 /// remarks>
 /// 創(chuàng)建:2014.02.09
 /// /remarks>
 /// /summary>
 public interface InterfaceUserService:InterfaceBaseServiceUser>
 {

  /// summary>
  /// 用戶是否存在
  /// /summary>
  /// param name="userName">用戶名/param>
  /// returns>布爾值/returns>
  bool Exist(string userName);

  /// summary>
  /// 查找用戶
  /// /summary>
  /// param name="userID">用戶ID/param>
  /// returns>/returns>
  User Find(int userID);

  /// summary>
  /// 查找用戶
  /// /summary>
  /// param name="userName">用戶名/param>
  /// returns>/returns>
  User Find(string userName);

  /// summary>
  /// 用戶列表
  /// /summary>
  /// param name="pageIndex">頁碼數(shù)/param>
  /// param name="pageSize">每頁記錄數(shù)/param>
  /// param name="totalRecord">總記錄數(shù)/param>
  /// param name="order">排序:0-ID升序(默認),1ID降序,2注冊時間升序,3注冊時間降序,4登錄時間升序,5登錄時間降序/param>
  /// returns>/returns>
  IQueryableUser> FindPageList(int pageIndex, int pageSize, out int totalRecord,int order);
 }
}

4、BLL項目
BLL項目中要實現(xiàn)InterfaceUserService接口的方法,先添加BaseService的

using Ninesky.IBLL;
using Ninesky.IDAL;
namespace Ninesky.BLL
{
 /// summary>
 /// 服務基類
 /// remarks>創(chuàng)建:2014.02.03/remarks>
 /// /summary>
 public abstract class BaseServiceT> : InterfaceBaseServiceT> where T : class
 {
  protected InterfaceBaseRepositoryT> CurrentRepository { get; set; }

  public BaseService(InterfaceBaseRepositoryT> currentRepository) { CurrentRepository = currentRepository; }

  public T Add(T entity) { return CurrentRepository.Add(entity); }

  public bool Update(T entity) { return CurrentRepository.Update(entity); }

  public bool Delete(T entity) { return CurrentRepository.Delete(entity); }
 }
}

這個類的構造函數(shù)中要傳入一個參數(shù)就是currentRepository 這個在繼承的時候進行傳入。這里還是看用戶類。

using Ninesky.DAL;
using Ninesky.IBLL;
using Ninesky.Models;
using System.Linq;

namespace Ninesky.BLL
{
 /// summary>
 /// 用戶服務類
 /// remarks>
 /// 創(chuàng)建:2014.02.12
 /// /remarks>
 /// /summary>
 public class UserService:BaseServiceUser>,InterfaceUserService
 {
  public UserService() : base(RepositoryFactory.UserRepository) { }

  public bool Exist(string userName) { return CurrentRepository.Exist(u => u.UserName == userName);}

  public User Find(int userID) { return CurrentRepository.Find(u => u.UserID == userID); }

  public User Find(string userName) { return CurrentRepository.Find(u => u.UserName == userName); }

  public IQueryableUser> FindPageList(int pageIndex, int pageSize, out int totalRecord, int order)
  {
   switch(order)
   {
    case 0: return CurrentRepository.FindPageList(pageIndex, pageSize, out totalRecord, u => true, true, u => u.UserID);
    case 1: return CurrentRepository.FindPageList(pageIndex, pageSize, out totalRecord, u => true, false, u => u.UserID);
    case 2: return CurrentRepository.FindPageList(pageIndex, pageSize, out totalRecord, u => true, true, u => u.RegistrationTime);
    case 3: return CurrentRepository.FindPageList(pageIndex, pageSize, out totalRecord, u => true, false, u => u.RegistrationTime);
    case 4: return CurrentRepository.FindPageList(pageIndex, pageSize, out totalRecord, u => true, true, u => u.LoginTime);
    case 5: return CurrentRepository.FindPageList(pageIndex, pageSize, out totalRecord, u => true, false, u => u.LoginTime);
    default: return CurrentRepository.FindPageList(pageIndex, pageSize, out totalRecord, u => true, true, u => u.UserID);
   }
   
  }
 }
}

上面這個FindPageList代碼太累贅了,一時還沒想到好方法。

5、總結
今天寫到這里還是在想項目間的調用實現(xiàn),寫了兩個base接口、兩個base類,以后其他的類都從它們繼承,寫法都很類似。下次可以開始做界面了,在Ninesky.Web項目中基本上是通過IBLL,BLL跟數(shù)據(jù)進行打交道了。

 ===================================================

FindPageList() 這個排序的方法確實不太通用,代碼修改如下:

1、接口 InterfaceBaseRepository

修改兩個接口方法如圖紅框部分。

image

2、BaseRepository類

添加OrderBy方法,代碼如下:

/// summary>
  /// 排序
  /// /summary>
  /// typeparam name="T">類型/typeparam>
  /// param name="source">原IQueryable/param>
  /// param name="propertyName">排序屬性名/param>
  /// param name="isAsc">是否正序/param>
  /// returns>排序后的IQueryableT>/returns>
  private IQueryableT> OrderBy(IQueryableT> source, string propertyName, bool isAsc)
  {
   if (source == null) throw new ArgumentNullException("source", "不能為空");
   if (string.IsNullOrEmpty(propertyName)) return source;
   var _parameter = Expression.Parameter(source.ElementType);
   var _property = Expression.Property(_parameter, propertyName);
   if (_property == null) throw new ArgumentNullException("propertyName", "屬性不存在");
   var _lambda = Expression.Lambda(_property, _parameter);
   var _methodName = isAsc ? "OrderBy" : "OrderByDescending";
   var _resultExpression = Expression.Call(typeof(Queryable), _methodName, new Type[] { source.ElementType, _property.Type }, source.Expression, Expression.Quote(_lambda));
   return source.Provider.CreateQueryT>(_resultExpression);
  }
修改FindList和FindPageList方法,修改下圖

image

3、修改UserService的FindPageList方法

修改后的代碼如下:

public IQueryableUser> FindPageList(int pageIndex, int pageSize, out int totalRecord, int order)
  {
   bool _isAsc = true;
   string _orderName = string.Empty;
   switch(order)
   {
    case 0:
     _isAsc = true;
     _orderName = "UserID";
     break;
    case 1:
     _isAsc = false;
     _orderName = "UserID";
     break;
    case 2: 
     _isAsc = true;
     _orderName = "RegistrationTime";
     break;
    case 3: 
     _isAsc = false;
     _orderName = "RegistrationTime";
     break;
    case 4: 
     _isAsc = true;
     _orderName = "LoginTime";
     break;
    case 5: _isAsc = false;
     _orderName = "LoginTime";
     break;
    default: 
     _isAsc = false;
     _orderName = "UserID";
     break;
   }
   return CurrentRepository.FindPageList(pageIndex, pageSize, out totalRecord, u => true, _orderName, _isAsc);
  }

以上就是ASP.NET MVC5 網(wǎng)站開發(fā)框架模型、數(shù)據(jù)存儲以及業(yè)務邏輯的相關介紹,比之前兩節(jié)的內(nèi)容是不是更加豐富了,希望本文可以對大家的學習有所幫助。

您可能感興趣的文章:
  • ASP.NET MVC5網(wǎng)站開發(fā)用戶登錄、注銷(五)
  • PHP MVC模式在網(wǎng)站架構中的實現(xiàn)分析
  • ASP.NET MVC5網(wǎng)站開發(fā)用戶注冊(四)
  • MVC4 網(wǎng)站發(fā)布(整理+部分問題收集和解決方案)
  • CodeIgniter php mvc框架 中國網(wǎng)站
  • PHP發(fā)明人談MVC和網(wǎng)站設計架構 貌似他不支持php用mvc
  • ASP.NET MVC5網(wǎng)站開發(fā)項目框架(二)
  • ASP.NET MVC5網(wǎng)站開發(fā)顯示文章列表(九)
  • ASP.NET MVC5網(wǎng)站開發(fā)添加文章(八)
  • 一步步打造簡單的MVC電商網(wǎng)站BooksStore(1)

標簽:汕尾 洛陽 贛州 青海 崇左 南寧 衢州 巨人網(wǎng)絡通訊聲明:本文標題《ASP.NET MVC5 網(wǎng)站開發(fā)框架模型、數(shù)據(jù)存儲、業(yè)務邏輯(三)》,本文關鍵詞  ASP.NET,MVC5,網(wǎng)站開發(fā),框架,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。

  • 相關文章
  • 下面列出與本文章《ASP.NET MVC5 網(wǎng)站開發(fā)框架模型、數(shù)據(jù)存儲、業(yè)務邏輯(三)》相關的同類信息!
  • 本頁收集關于ASP.NET MVC5 網(wǎng)站開發(fā)框架模型、數(shù)據(jù)存儲、業(yè)務邏輯(三)的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    亚洲黄色小视频在线观看| 黑森林国产精品av| 欧美激情日韩图片| 一区二区三区国产盗摄| 四虎8848精品成人免费网站| 久久99精品久久久野外观看| 欧美激情视频三区| 污污内射在线观看一区二区少妇| 亚洲精品国产精品乱码| 亚洲一区二区日本| 波多野结衣黄色| 亚洲二区在线观看| 人人妻人人做人人爽| 日韩欧美中文字幕在线播放| 欧美一区精品| 国产不卡视频| 婷婷亚洲一区二区三区| julia一区二区中文久久94| 小说区图片区图片区另类灬| 国产又粗又长又黄| 外国成人在线视频| 成人午夜国产福到在线| 成年女人在线视频| 欧美性在线视频| 蜜桃视频成人在线观看| 国产精品久久久久久久泡妞| 欧美日韩成人一区| 欧美中文日韩| 黄色视屏网站在线免费观看| 瑟瑟在线观看| 狠狠色综合色区| 亚洲av成人精品毛片| 亚洲综合在线不卡| 艹b视频在线观看| 色综合久久综合网| 亚洲午夜无码av毛片久久| 精品卡一卡二卡三卡四在线| 高清一级毛片视频| 亚洲美女视频在线观看| 爽爽爽在线观看| 成年网站在线| 人人干在线视频| 1234区中文字幕在线观看| 亚洲婷婷久久综合| 免费看欧美黑人毛片| 亚洲乱码精品| 日本一区二区三区四区五区| 拔插拔插华人永久免费| 日本美女一区二区| bl视频在线免费观看| 欧美日韩在线一二三| 国产又黄又大又粗视频| 国产一区二区三区四区五区六区| 亚洲人成影视在线观看| 成人动漫在线一区| 色婷婷亚洲精品| 蜜臀在线观看| 国产精品久久毛片av大全日韩| 亚洲精品aa| 欧美国产激情| 国产精品久久精品国产| 欧美不卡一区二区三区四区| www.在线视频.com| 欧美 日韩 亚洲 一区| 狠狠爱成人网| 91精品产国品一二三产区| 欧美一级日韩免费不卡| 人人澡人人添人人爽一区二区| 亚洲高清免费在线观看| 日日噜噜噜噜久久久精品毛片| 少妇毛片一区二区三区| 波多野结衣中文字幕一区| 成人av集中营| 超碰国产精品一区二页| 欧美一区午夜视频在线观看| 中文字幕日韩欧美精品高清在线| 日韩午夜电影| 久久中文字幕免费| 国内老熟妇对白hdxxxx| 91精品亚洲| 蜜桃久久av一区| 中文字幕在线播放| 亚洲主播在线播放| 免费精品国产的网站免费观看| 欧美国产另类| 性色av一区二区三区| 亚洲福利国产| 91污片在线观看| 五月精品视频| 久久久免费看| 91av精品| www欧美xxxx| 国产av精国产传媒| 天堂社区在线视频| 久久香蕉国产线看观看网| 国产精品免费aⅴ片在线观看| 国模精品视频| 日本中文字幕在线一区| 欧美丰满少妇人妻精品| 日日夜夜天天综合| 亚洲天堂av图片| 天天操天天射天天爽| а√天堂资源国产精品| 日韩精品xxx| 国产精品久线在线观看| 亚洲熟妇av一区二区三区漫画| 欧美丰满美乳xxⅹ高潮www| 伊人在线视频观看| 999在线精品| 不卡av免费在线观看| 国产九一精品| 欧美壮男野外gaytube| 欧美一二三区在线| 91传媒视频免费| 国产真实伦在线观看| 成人激情综合| 欧美猛交ⅹxxx乱大交视频| 国产图片一区| 天天综合网久久| 国产麻豆91视频| 欧美精品一级片| 亚洲欧洲日本mm| 亚洲一卡二卡三卡四卡五卡| 免费精品99久久国产综合精品应用| 香港三级韩国三级日本三级| 亚洲人成高清| 国产精品毛片一区二区| 一区二区三区在线影院| 揄拍成人国产精品视频| 五月天婷亚洲天综合网鲁鲁鲁| 国产日韩欧美三级| 美女极度色诱视频www免费观看| 女人丝袜激情亚洲| 中文精品电影| 免费视频观看成人| 国产偷激情在线| 91精品久久久久久久蜜月| 久久久久xxxx| 在线看国产一区二区| 欧美 日韩 中文字幕| 亚洲人视频在线观看| 国产一级二级三级视频| 亚洲综合久久久久| 本道综合精品| 欧洲亚洲妇女av| 欧美日韩久久| 亚洲精品偷拍| 久久久视频6r| 日本一级黄视频| 成人看片网站| 波多野结衣一区二区三区在线观看| 亚洲淫片在线视频| 国产又粗又猛又爽又黄的视频小说| 91免费精品国偷自产在线在线| 午夜在线不卡| 精品一二三四在线| 污污美女网站| 色婷婷av一区二区三区gif| 精品国产一区二区三区免费| 国产高清在线精品一区二区三区| 日产电影一区二区三区| 视频免费1区二区三区| 欧美日韩中文字幕在线视频| 精品国产中文字幕第一页| 91亚洲永久精品| www91在线观看| 久久人体做爰大胆| 久久久成人精品一区二区三区| 人人狠狠综合久久亚洲婷婷| 四虎影成人精品a片| 男女视频免费网站| 中文字幕高清在线播放| 久久99精品国产麻豆不卡| 91久久国产自产拍夜夜嗨| 国产午夜伦鲁鲁| 最近2018年中文字幕在线| 国产精品午夜久久久久久| 在线成人动漫av| 日韩精品欧美成人高清一区二区| 国产视色精品亚洲一区二区| 五月天婷婷综合社区| 久草中文视频| 一区二区三区亚洲视频| 亚洲婷婷综合久久一本伊一区| 2023国产一二三区日本精品2022| 国产成人av电影| 午夜性爽视频男人的天堂| 国产一级在线观看www色| 色视频网站在线观看| 在线观看v片| 蜜桃精品视频在线| 国产三级中文字幕| 亚洲高清免费| 亚洲美女性囗交| r级无码视频在线观看| 国产视频在线观看一区二区三区| 99热国内精品永久免费观看| 亚洲一区在线观看免费观看电影高清| 国产白丝一区二区三区| 国产在线观看不卡| 久久久久无码精品国产sm果冻| 成人国产精品免费网站| 久久婷婷国产91天堂综合精品| 国产精品麻豆入口| 欧美 国产 精品| 欧洲专线二区三区| 国产精品美女一区二区在线观看| 最新eeuss影院在线观看| 91精品婷婷国产综合久久竹菊| 揉丰满老妇老女人的毛片| 久热精品视频在线免费观看| 一区二区三区四区免费视频| 三年片观看免费观看大全视频下载| 亚洲国产裸拍裸体视频在线观看乱了| 中文字幕日本乱码精品影院| 免费一级欧美在线观看视频| 欧美精品自拍偷拍| 深爱激情久久| 日韩午夜在线视频| 日日摸夜夜添夜夜添国产精品| 一区二区成人在线| 91久久精品| 久久亚洲一区二区三区明星换脸| 综合精品一区| 亚洲人成网站在线| 欧美精品videosex极品1| 不卡福利视频| 91在线视频在线观看| 亚洲国产精品久久久久久久| 国产精品毛片无码| 国产中文字幕在线看| 懂色av蜜桃av| 好看的视频你懂的| 四虎4545www精品视频| 久久人妻无码aⅴ毛片a片app| 久久99精品国产自在现线小黄鸭| 欧美日韩国产精品自在自线| 国产伦精品一区二区三区在线播放| 久久久久久97三级| 久久激情网站| 淫视频在线观看| 日韩在线播放中文字幕| 日韩精品第二页| 国内精品久久久久久久久久久| 国产精品人妖ts系列视频| 葵司免费一区二区三区四区五区| 3344国产永久在线观看视频| 久久久久久免费观看| 在线电影看在线一区二区三区| 在线观看国产福利视频| 免费成人av| 我不卡伦不卡影院| 99国产牛牛视频在线网站| 女性隐私黄www网站视频| 一级片aaaa| 免费观看国产视频| 亚洲第一激情av| 春意影院午夜免费入口| 成人综合婷婷国产精品久久蜜臀| 久久久久麻豆v国产| 久久成人羞羞网站| 可以免费观看的黄色网址| 欧美日韩一区不卡| 91成年人视频| 手机看片福利在线观看| 色综合电影网| 女同互添互慰av毛片观看| 精品国产一区二区三区免费| 欧美高清视频一区二区三区在线观看| 激情综合五月天| 特黄aaaaaaaaa毛片免费视频| 2020中文字字幕在线不卡| 中文字幕一区二区三区蜜月| 国产精品精品| 国内精品一区二区三区四区| 精品国产一级片| 91色在线porny| jzzjzzjzz亚洲成熟少妇| 97成人超碰| 亚洲成人黄色片| 毛片av免费在线观看| 性欧美大战久久久久久久| 手机精品视频在线观看| 日本特级黄色片| 在线国产电影不卡| 欧美综合一区第一页| 特级西西444www大精品视频免费看| 精品久久久久久久大神国产| 黄色电影网站在线观看| 国产高清在线一区| 手机看片福利永久国产日韩| 日韩网红少妇无码视频香港| 国产激情一区二区三区| 91p九色成人| 日韩免费电影一区二区三区| 色偷偷7777www人| 51精品国自产在线| 欧美亚男人的天堂| 青青青视频在线播放| 小明看看成人免费视频| 精品国产综合区久久久久久| 亚洲国产日韩综合久久精品| 国产无人区码熟妇毛片多| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 日韩少妇内射免费播放18禁裸乳| 国产美女撒尿一区二区| 最新av在线免费观看| 精品电影一区二区三区| 久久丫精品久久丫| 欧美视频免费一区二区三区| 日本欧美在线视频| 一个人免费播放在线视频看片| 亚洲国内高清视频| 国产一区二区三区美女| а√天堂中文资源在线bt| 久久久久北条麻妃免费看| 亚洲www啪成人一区二区麻豆| 黄色成人小视频| 国产精品不卡一区二区三区| 欧美丝袜一区二区| 久久久久www| 亚洲少妇中文在线| 日本免费看黄| 日本三级电影在线播放| 黄色工厂这里只有精品| 91精品国产乱码久久| 男女视频一区二区| 国产精品中文|