日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

MVC三层+会话层+线程安全+抽象工厂+DataBase First的基础框架

發布時間:2025/4/16 c/c++ 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MVC三层+会话层+线程安全+抽象工厂+DataBase First的基础框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.建立數據庫OA,表UserInfo

    

2.創建類庫項目以及mvc4 web項目

  1)OA.Model 層:模型

  2)OA.IDal 層 :數據接口

  3)OA.Dal層 :數據實現

4)OA.IDBSession層 :會話接口

5)OA.DBSession 層 :會話層

6)OA.IBLL 層 :業務員接口

7)OA.BLL?層 :業務實現

8)OA.Web MVC UI層

3.編寫代碼

  1)在model層中添加EF上下文,

2)編寫數據接口層的代碼:對表的操作(1增2刪3改4查5分頁),在分頁中返回總記錄數,在查詢中根據用戶輸入的lambda表達式進行具體查詢一條記錄或者多條記錄

//增刪改查 分頁 T AddEntity(T t); bool DeleteEntity(T t); bool UpdateEntity(T t); IQueryable<T> LoadEntities(Expression<Func<T,bool>> whereLambda); IQueryable<T> LoadPageEntitis<s>(int pageIndex, int pageSize, out int toalCount, Expression<Func<T, bool>> whereLambda, Expression<Func<T,s>> orderByLambda, bool IsAsc); View Code

  在分頁中實現排序,并可選順序或者逆序。LoadPageEntites<s> s代表orderByLambda值的類型,當使用id進行排序時,<s>值為int,當使用name進行排序時,<s>值為string。

因為每一張表都要實現這個接口,因此將如上“//增刪改查 分頁”封裝成IBaseDal<T>。其他表只需要繼承IBaseDal<T>,將對應的表傳入T即可。

1 public interface IDeviceInfoDal : IBaseDao<SYS_DEVICE_TABLE> 2 { 3 4 } View Code

3)編寫Dal層,繼承自IDal,一個表對應一個dal,例如userinfo這張表,創建UserInfoDal繼承自IUserInfoDal,實現IUserInfoDal的接口,IUserInfoDal繼承自IBaseDal,每一張表都需要實現這些接口((1增2刪3改4查5分頁)),因此,需要繼續封裝這些接口的實現,封裝成BaseDal

1 public class BaseDal<T> 2 where T:class,new() 3 { 4 MLedSystemEntities dbContext = DBContxtFactory.CreateDbContext(); 5 public T AddEntity(T t) 6 { 7 dbContext.Entry<T>(t).State = EntityState.Added; 8 //dbContext.SaveChanges(); 9 return t; 10 } 11 12 public bool DeleteEntity(T t) 13 { 14 dbContext.Entry<T>(t).State = EntityState.Deleted; 15 return true;//dbContext.SaveChanges() > 0; 16 } 17 18 public bool UpdateEntity(T t) 19 { 20 dbContext.Entry<T>(t).State = EntityState.Modified; 21 return true;//dbContext.SaveChanges() > 0; 22 } 23 24 public IQueryable<T> LoadEntities(System.Linq.Expressions.Expression<Func<T, bool>> whereLambda) 25 { 26 return dbContext.Set<T>().Where(whereLambda); 27 } 28 29 public IQueryable<T> LoadPageEntitis<s>(int pageIndex, int pageSize, out int toalCount, System.Linq.Expressions.Expression<Func<T, bool>> whereLambda, System.Linq.Expressions.Expression<Func<T,s>> orderByLambda, bool IsAsc) 30 { 31 var res = dbContext.Set<T>().Where(whereLambda); 32 toalCount = res.Count(); 33 IQueryable<T> temp; 34 if (IsAsc) 35 { 36 temp = res.OrderBy<T, s>(orderByLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize); 37 } 38 else 39 { 40 temp = res.OrderByDescending<T, s>(orderByLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize); 41 } 42 return temp; 43 } 44 45 } View Code

而每一張表只需要繼承自BaseDal即可,如此大大提高代碼重用。先繼承實現,繼承接口,

public class DeviceTypeInfoDal : BaseDal<SYS_DEVICE_TYPE_TABLE>, IDeviceTypeInfoDal{} View Code public class DeviceInfoDal :BaseDal<SYS_DEVICE_TABLE>, IDeviceInfoDal{} View Code

  這里需要改進的地方是:每一次操作增刪查改都需要savechange()一次,每一次操作都需要連接數據庫,假設用戶的有一次操作是關聯三張表,那么一次操作就需要三次打開數據庫連接,然后又關閉數據庫連接,如此,效率大大下降。解決辦法:將SaveChange()提取出來,使得用戶操作一次無任關聯多少張表,只需要一次數據庫操作即可。(由會話層來實現)

?  4)編寫中間會話層,會話層的作用是降低業務層與數據層的耦合。

  編寫會話層接口和實現

  會話層主要作用:是對數據實現層的管理,以及如上提到的一次性SaveChange的問題。

IDeviceInfoDal DeviceInfoDal { get; set; }IDeviceTypeInfoDal DeviceTypeInfoDal { get; set; }bool SaveChange(); View Code 1 MLedSystemEntities dbContext { 2 get { 3 return DBContxtFactory.CreateDbContext(); 4 //這里需要保證EF上下文唯一,也就是線程安全 5 } 6 } 7 public IDeviceInfoDal DeviceInfoDal 8 { 9 get 10 { 11 //return DBSessionFactory.CreateDeviceInfoDal(); 12 return AbstractFactory.CreateDeviceInfoDal(); 13         //這里使用抽象工廠創建對象實例-》目的:降低耦合度 14 } set { DeviceInfoDal = value; } } public IDeviceTypeInfoDal DeviceTypeInfoDal { 15 get { 16 //return DBSessionFactory.CreateDeviceTypeInfoDal(); 17 return AbstractFactory.CreateDeviceTypeInfoDal(); 18 //這里使用抽象工廠創建對象實例-》目的:降低耦合度 19 } set { DeviceTypeInfoDal = value; } } public bool SaveChange() { return dbContext.SaveChanges()>0; } View Code

  如何保證EF上下文線程安全呢?這里使用的是CallContext這個類進行管理。

/// <summary>
/// EF上下文,線程唯一性
/// </summary>
public static MLedSystemEntities CreateDbContext()
{
MLedSystemEntities DbContext = CallContext.GetData("dbContext") as MLedSystemEntities;
if (DbContext == null) {
DbContext = new MLedSystemEntities();
CallContext.SetData("dbContext",DbContext);
}
return DbContext;
}

  //抽象工廠 使用反射的方法進行 解耦

  在web.config中添加配置節點

<add key="DalAssemblyPath" value="OA.Dal"/>
<add key="NameSpace" value="OA.Dal"/>

代碼如下:

private static readonly string DalAssemblyPath = ConfigurationManager.AppSettings["DalAssemblyPath"];
private static readonly string NameSpace = ConfigurationManager.AppSettings["NameSpace"];

/// <summary>
/// 創建DeviceInfo實例
/// </summary>
/// <returns></returns>
public static IDeviceInfoDal CreateDeviceInfoDal()
{
string fullClassName = NameSpace + ".DeviceInfoDal";
var assembly = Assembly.Load(NameSpace);
return assembly.CreateInstance(fullClassName) as IDeviceInfoDal;
}

  5)編寫業務接口層和業務實現層。在業務接口層同數據操作DAL層類似

    需要注意的是:需要保證會話層線程安全,同樣是使用CallContext來進行管理

  public DBSession CreateDBSession(){

    DBSession dbSession=CallContext.GetData("dbsession") as DBSession;

if(dbSession==null){

dbSession=new DBSession();

CallContext.SetData("dbsession",dbSession);

}

return dbSession;

  }

?  6)MVC ui層調用業務層,業務層調用會話層,會話層調用數據層。

  在UI層中,添加對應表的Controller,異步加載方式獲取數據。

view中:

<table border="1 solid red" id="tab">
@Html.ActionLink("添加","Create")
<tr>
<th width="50">id</th>
<th width="50">name</th>
<th width="50">ip</th>
<th width="50">port</th>
</tr>
<tbody id="list"></tbody>
</table>

js代碼:

<script type="text/javascript"> $(function () { onAsynLoad(3,5); }); function onAsynLoad(pageindex, pagesize) { $.getJSON( '@Url.Action("AsynLoad","DeviceInfo")', { pageIndex: pageindex, pageSize: pagesize },//傳入參數 function (temp) {//temp為返回的結果 var list = $('#list'); list.empty(); $.each(temp.list1, function (index, item) { list.append('<tr><td>' + item.id + '</td><td>' + item.Name + '</td><td>' + item.Ip + '</td><td>' + item.Port + '<a href="@Url.Action("Delete","DeviceInfo")?id=' + item.id + '">刪除</a></td></tr>') }); list.append('<tr><td colspan=4>總記錄數:' + temp.tolCount + '</td></tr>'); } ); } </script> View Code

Controller中的異步加載代碼:

1 public ActionResult AsynLoad(int pageIndex, int pageSize) 2 { 3 //int pageIndex=1; 4 //int pageSize=4; 5 int totalCount=0; 6 var result = DeviceInfoService.LoadPageEntitis<int>(pageIndex, pageSize, out totalCount, u => true, u => u.DEVID, true).ToList(); 7 List<DeviceInfoViewModel> listDeviceInfoViewModel=new List<DeviceInfoViewModel>(); 8 foreach(var res in result){ 9 DeviceInfoViewModel item=new DeviceInfoViewModel(); 10 item.id=res.DEVID; 11 item.Name=res.DEVNAME; 12 item.Ip=res.DEVIP; 13 item.Port=res.DEVPORT; 14 listDeviceInfoViewModel.Add(item); 15 } 16 var temp = new 17 { 18 list1 = listDeviceInfoViewModel, 19 tolCount = totalCount.ToString() 20 }; 21 return Json(temp,JsonRequestBehavior.AllowGet); 22 } View Code

?

總結:關鍵知識點:1、EF線程安全、會話層線程安全。

         2、抽象工廠創建實例解耦。

         3、使用會話層解耦。

?代碼下載

?http://files.cnblogs.com/files/jxsd/OA.Web.zip

http://files.cnblogs.com/files/jxsd/OA1.zip

?

轉載于:https://www.cnblogs.com/jxsd/p/4993748.html

總結

以上是生活随笔為你收集整理的MVC三层+会话层+线程安全+抽象工厂+DataBase First的基础框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 青青草精品在线视频 | 精品动漫一区二区三区在线观看 | 屁屁影院第一页 | 一级片手机在线观看 | 色播放 | 欧美aa | 国产高清免费在线 | www.夜色| 怡红院最新网址 | 婷婷久久五月天 | 国产性猛交xxxⅹ交酡全过程 | 一区二区三区四区人妻 | 重口味av| 日韩亚洲欧美一区二区三区 | 中国美女黄色 | 99久久精品国产成人一区二区 | 99热国产 | 久久精品三级视频 | 歪歪6080| 日批av| 免费古装一级淫片潘金莲 | 亚洲一二三级 | 操夜夜 | 国产精品熟女视频 | 最新日韩在线视频 | 亚洲精品女人久久久 | 91人人视频| 在线免费观看视频黄 | 精品国产区一区二 | 国产一级淫片免费 | 国产成人无码一区二区在线观看 | 美女隐私免费观看 | jizz日本少妇 | 欧美一级免费黄色片 | 亚洲一区二区三区免费视频 | 在线a天堂 | 国产免费黄色录像 | 午夜不卡影院 | 丝袜国产一区 | 国产 欧美 精品 | 日韩欧美精品一区二区三区 | www.youjizz.com中国| 草草在线免费视频 | 午夜伦理福利视频 | 免费看黄色大片 | 一级 黄 色 片69 | 国产午夜亚洲精品午夜鲁丝片 | 成人免费福利 | 欧美性视频一区二区三区 | 亚洲精品欧美日韩 | 欧美人体视频一区二区三区 | 亚洲成熟女性毛茸茸 | 亚洲女人网 | 性折磨bdsm欧美激情另类 | 超碰精品在线观看 | 深夜影院在线观看 | 福利资源在线 | 99人人爽| 在线看亚洲 | 国产白浆在线观看 | 小镇姑娘1979版 | 成人黄色小视频在线观看 | 黄色片网站在线观看 | av线上免费观看 | 67194av| 69sex久久精品国产麻豆 | 欧美毛片在线观看 | 欧美囗交做爰视频 | 欧美国产精品一区二区 | 美女一区二区视频 | 日韩精品国产一区二区 | 高潮流白浆在线观看 | 五月天精品在线 | 亚洲第一视频在线 | 久久综合资源 | 久久久久国产精品夜夜夜夜夜 | 影音先锋在线中文字幕 | 丁香六月婷婷综合 | 日本www在线播放 | 伊人免费 | 欧美大黄 | 专业操老外 | 无罩大乳的熟妇正在播放 | 国产一区二区视频免费 | 日韩精品久久久久久免费 | 欧洲熟妇的性久久久久久 | 一区二区自拍偷拍 | 在线观看国产一区二区三区 | 久草网视频在线观看 | 狠狠插av| 日韩av在线播放一区 | a级黄色影院 | 国产一区二区三区视频在线播放 | 可以在线观看的av网站 | 国产乱码精品1区2区3区 | 国产96在线 | 亚洲 | 国产99久 | 欧美aaa在线观看 | 日本特黄成人 |