一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 擴展ASP.NET MVC三層框架且使用StructureMap實現依賴注入1-Model層

擴展ASP.NET MVC三層框架且使用StructureMap實現依賴注入1-Model層

2019-10-31 13:46asp.net教程網 ASP.NET教程

本篇文章將向大家介紹如何添加Service和Repository層并且使用StructureMap把Service層注入到Controller,把Repository注入到Service層。

本篇文章將向大家介紹如何添加Service和Repository層并且使用StructureMap把Service層注入到Controller,把Repository注入到Service層。Service層主要是我們的業務邏輯層,這一層不和底層的Database打交道,和Database打交道的是Repository數據持久層。本篇文章通過使用StructureMap依賴注入使Controller,Service,Repository三層的耦合度降到最低。

本系統使用NorthWind開源數據,并且使用EntityFramework5.0實現對數據庫的Object映射。

開始正題之前先來看一下成型的框架結構,我們將圍繞這個截圖進行展開。

擴展ASP.NET MVC三層框架且使用StructureMap實現依賴注入1-Model層

 

首先我們看TYStudioDemo.Models這個Project里面的內容

擴展ASP.NET MVC三層框架且使用StructureMap實現依賴注入1-Model層

這里面有我們的EntityFramwork的edmx文件,Northwind的數據庫表映射的對象集合。這里建立ADO.Net Entity Data Model的時候沒有使用默認生成一堆.tt文件的方式,而是使用了老的形式。實現方法是首先按默認程序建立起data model,建立好data model之后刪除.tt文件。然后打開.edmx文件,右鍵單擊空白處選擇Properties(屬性),會出現下面的截圖,這時候只需要修改一下Code Generation Strategy(中文翻譯不知道是什么,第一個就對了)的值,默認是None,我們修改為Default,然后保存.edmx

擴展ASP.NET MVC三層框架且使用StructureMap實現依賴注入1-Model層



你應該已經注意到了,項目里多了一個TYEntities.cs文件,這個我們是我們這個系統中實現Transaction(事務處理)的關鍵。
我們使用static和[ThreadStatic]屬性來保證一個線程拿到的TYEntities(ObjectContext)總是同一個,這就解決了Transaction事務的問題。沒有解釋到的請詳細閱讀下面代碼里面的注釋。

 

復制代碼代碼如下:

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Web;

 namespace TYStudioDemo.Models
 {
     public partial class TYEntities
     {
         #region Fields

         //定義索引名稱
         const string ContextKey = "TYEntities";

         //標記為ThreadStaticAttribute的靜態字段不在線程之間共享。
         //每個執行線程都有單獨的字段實例,并且獨立地設置及獲取該字段的值。如果在不同的線程中訪問該字段,則該字段將包含不同的值。
         [ThreadStatic]
         private static TYEntities _current;

         #endregion

         #region Properties

         public bool Disposed { get; set; }

         /// <summary>
         /// 當系統工作在HttpContext下,將使用延遲家在技術返回一個TYEntities(ObjectContext),如果沒有HttpContext將返回null
         /// 
         /// 不論在哪里使用TYEntities,在請求結束后都需要調用TYEntities.Cleanup()方法
         /// 最佳的方式是TYEntities.Cleanup()放到Global.asax.cs文件里面。
         /// void Application_EndRequest(object sender, EventArgs e)
         /// {
         ///     TYStudioDemo.Models.TYEntities.Cleanup();
         /// }
         /// </summary>
         private static TYEntities ForWebRequest
         {
             get
             {
                 var context = HttpContext.Current;

                 //檢查HttpContext是否存在
                 if (context != null)
                 {
                     //試著從context中得到TYEntities
                     var result = context.Items[ContextKey] as TYEntities;

                     if (result == null)
                     {
                         //創建新的datacontext,并且保存到context里面
                         result = new TYEntities();
                         context.Items[ContextKey] = result;
                     }

                     return result;
                 }

                 return null;
             }
         }

         /// <summary>
         /// 這是一個用來獲取TYEntities(ObjectContext)的公共屬性
         /// 
         /// 如果你通過HttpContext獲取TYEntities,同樣不論在哪里使用TYEntities,在請求結束后都需要調用TYEntities.Cleanup()方法
         /// 
         /// 如果沒有通過HttpContext獲取TYEntities,你必須在使用結束之后調用TYEntities.Cleanup()方法,來清理ObjectContext。
         /// 
         /// 需要注意的一點是,無論使用哪種方式獲取TYEntities,我們都必須手動的清理和Dispose TYEntities(ObjectContext)。
         /// 所以一定不要在using塊中使用TYEntities(ObjectContext)。
         /// </summary>
         public static TYEntities Current
         {
             get
             {
                 //從HttpContext中獲取datacontext
                 var result = TYEntities.ForWebRequest;

                 if (result != null)
                     return result;

                 //試著獲取當前活動的TYEntities
                 if (_current == null)
                     _current = new TYEntities();

                 return _current;
             }
         }

         /// <summary>
         /// 清理結束TYEntities(ObjectContext)
         /// </summary>
         public static void Cleanup()
         {
             if (HttpContext.Current != null)
             {
                 var result = HttpContext.Current.Items[ContextKey] as TYEntities;

                 if (result != null)
                     result.Dispose();

                 HttpContext.Current.Items[ContextKey] = null;
             }
             else if (_current != null)
             {
                 _current.Dispose();
                 _current = null;
             }
         }

 
         protected override void Dispose(bool disposing)
         {
             bool disposed = Disposed;
             Disposed = true;

             if (!disposed)
                 Cleanup();

             base.Dispose(disposing);
         }

         #endregion
     }
 }

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 毛片免费网站 | 四虎最新永久在线精品免费 | 亚洲大片免费看 | 无颜之月全集免费观看 | www.四虎在线 | 2020国产精品视频 | 饭冈加奈子黑人解禁在线播放 | 桥本有菜作品在线 | 91精品国产综合久久香蕉 | 欧美办公室silkstocking | 国产馆精品推荐在线观看 | freexxxxxhd张柏芝 | 91欧美国产 | 亚洲第一区二区快射影院 | 亚洲AV精品一区二区三区不卡 | 国产色视频一区二区三区 | 高清视频大片免费观看 | 欧美日韩国产手机在线观看视频 | 日本中文字幕一区二区有码在线 | 超鹏97国语 | 2019男人天堂 | 青草社区视频 | 女人用粗大自熨喷水在线视频 | 国产suv精品一区二区四区三区 | 爱情岛论坛亚洲自拍 | 日本在线观看免费高清 | 国产免费一区二区三区 | 欧美亚洲桃花综合 | 麻豆资源 | 无颜之月全集免费观看 | 国产日韩精品欧美一区 | 日本中文字幕一区二区有码在线 | 国产精品视频久久久 | h版欧美大片免费观看 | 玩两个少妇女邻居 | 欧美日韩一区二区三区在线观看 | 亚洲第6页 | 国产精品一区二区三区久久 | 污黄漫| 免费在线观看小视频 | 国产suv精品 |