擴(kuò)展ASP.NET MVC三層框架且使用StructureMap實(shí)現(xiàn)依賴注入1-Model層
本篇文章將向大家介紹如何添加Service和Repository層并且使用StructureMap把Service層注入到Controller,把Repository注入到Service層。Service層主要是我們的業(yè)務(wù)邏輯層,這一層不和底層的Database打交道,和Database打交道的是Repository數(shù)據(jù)持久層。本篇文章通過使用StructureMap依賴注入使Controller,Service,Repository三層的耦合度降到最低。
本系統(tǒng)使用NorthWind開源數(shù)據(jù),并且使用EntityFramework5.0實(shí)現(xiàn)對數(shù)據(jù)庫的Object映射。
開始正題之前先來看一下成型的框架結(jié)構(gòu),我們將圍繞這個截圖進(jìn)行展開。
首先我們看TYStudioDemo.Models這個Project里面的內(nèi)容
這里面有我們的EntityFramwork的edmx文件,Northwind的數(shù)據(jù)庫表映射的對象集合。這里建立ADO.Net Entity Data Model的時候沒有使用默認(rèn)生成一堆.tt文件的方式,而是使用了老的形式。實(shí)現(xiàn)方法是首先按默認(rèn)程序建立起data model,建立好data model之后刪除.tt文件。然后打開.edmx文件,右鍵單擊空白處選擇Properties(屬性),會出現(xiàn)下面的截圖,這時候只需要修改一下Code Generation Strategy(中文翻譯不知道是什么,第一個就對了)的值,默認(rèn)是None,我們修改為Default,然后保存.edmx
你應(yīng)該已經(jīng)注意到了,項(xiàng)目里多了一個TYEntities.cs文件,這個我們是我們這個系統(tǒng)中實(shí)現(xiàn)Transaction(事務(wù)處理)的關(guān)鍵。
我們使用static和[ThreadStatic]屬性來保證一個線程拿到的TYEntities(ObjectContext)總是同一個,這就解決了Transaction事務(wù)的問題。沒有解釋到的請詳細(xì)閱讀下面代碼里面的注釋。
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";
//標(biāo)記為ThreadStaticAttribute的靜態(tài)字段不在線程之間共享。
//每個執(zhí)行線程都有單獨(dú)的字段實(shí)例,并且獨(dú)立地設(shè)置及獲取該字段的值。如果在不同的線程中訪問該字段,則該字段將包含不同的值。
[ThreadStatic]
private static TYEntities _current;
#endregion
#region Properties
public bool Disposed { get; set; }
/// <summary>
/// 當(dāng)系統(tǒng)工作在HttpContext下,將使用延遲家在技術(shù)返回一個TYEntities(ObjectContext),如果沒有HttpContext將返回null
///
/// 不論在哪里使用TYEntities,在請求結(jié)束后都需要調(diào)用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)
{
//創(chuàng)建新的datacontext,并且保存到context里面
result = new TYEntities();
context.Items[ContextKey] = result;
}
return result;
}
return null;
}
}
/// <summary>
/// 這是一個用來獲取TYEntities(ObjectContext)的公共屬性
///
/// 如果你通過HttpContext獲取TYEntities,同樣不論在哪里使用TYEntities,在請求結(jié)束后都需要調(diào)用TYEntities.Cleanup()方法
///
/// 如果沒有通過HttpContext獲取TYEntities,你必須在使用結(jié)束之后調(diào)用TYEntities.Cleanup()方法,來清理ObjectContext。
///
/// 需要注意的一點(diǎn)是,無論使用哪種方式獲取TYEntities,我們都必須手動的清理和Dispose TYEntities(ObjectContext)。
/// 所以一定不要在using塊中使用TYEntities(ObjectContext)。
/// </summary>
public static TYEntities Current
{
get
{
//從HttpContext中獲取datacontext
var result = TYEntities.ForWebRequest;
if (result != null)
return result;
//試著獲取當(dāng)前活動的TYEntities
if (_current == null)
_current = new TYEntities();
return _current;
}
}
/// <summary>
/// 清理結(jié)束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
}
}
相關(guān)文章
VS2015自帶LocalDB數(shù)據(jù)庫用法詳解
這篇文章主要為大家詳細(xì)介紹了VS2015自帶LocalDB數(shù)據(jù)庫的用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06.NET驗(yàn)證組件Fluent Validation使用指南
本文介紹了.NET驗(yàn)證組件Fluent Validation,并通過實(shí)例告訴我們這個驗(yàn)證組件的使用方法,以及與asp.net mvc驗(yàn)證庫的整合方案,這里推薦給有相同需求的小伙伴2014-11-11在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server的方法
下面小編就為大家分享一篇在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12Json返回時間的格式中出現(xiàn)亂碼問題的兩種解決方案
使用Json返回數(shù)據(jù)的時候時間的格式一般都會變了,變成我們不認(rèn)識的一些字符,那么當(dāng)我們遇到這些問題的時候我們該怎么解決呢,今天我就來小說一下這個的解決方法2013-10-10asp.net core 2.0 webapi集成signalr(實(shí)例講解)
下面小編就為大家分享一篇asp.net core 2.0 webapi集成signalr的實(shí)例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11