1. 程式人生 > >設計.NET應用程式資料訪問層的五大原則

設計.NET應用程式資料訪問層的五大原則

摘要:大多數使用.NET框架元件工作的開發人員的一個核心工作是實現資料訪問功能,他們建立的資料訪問層(data access layer)是應用程式的精華部分。本文概述了使用Visual Studio .NET和.NET框架元件建立資料訪問層需要考慮的五個想法。這些技巧包括通過使用基類(base class)利用面相物件技術和.NET框架元件基礎結構,使類容易繼承,在決定顯示方法和外部介面前仔細地檢驗需求。

  如果你正在建立以資料為中心(data-centric)的.NET框架元件應用程式,你最終必須建立資料訪問層。也許你知道在.NET框架元件中建立自己的程式碼有很多好處。因為它支援實現和介面(interface)繼承,你的程式碼更容易重複使用,特別是被使用不同的框架元件相容(Framework-compliant)語言的開發人員使用。本文我將概述為基於.NET框架元件的應用程式建立資料訪問層的五條規則。

  開始前,我必須提醒你建立的任何基於本文討論的規則的資料訪問層必須與傳統Windows平臺上開發人員喜歡的多層或者n層應用程式相容。在這種結構中,表現層包含Web窗體、Windows窗體、呼叫與資料訪問層的工作相應的事務層的XML服務程式碼。該層由多個數據訪問類(data access classe)組成。換句話說,在事務處理協調不是必要的情況下,表現層將直接呼叫資料訪問層。這種結構是傳統的模型-視列表-控制程式(Model-View-Controller,MVC)模式的變體,在多種情況下被Visual Studio .NET和它暴露的控制元件採用。

  規則1:使用面向物件特性

  最基本的面向物件事務是建立一個使用實現繼承的抽象類。這個基類可以包括你的所有資料訪問類通過繼承能夠使用的服務。如果那些服務足夠了,它們就能通過在整個組織的基類分佈實現重複使用。例如最簡單的情況是基類能夠為衍生類處理連線的建立過程,如列表1所示。


Imports System.Data.SqlClient

Namespace ACME.Data
Public MustInherit Class DALBase : Implements IDisposable
Private _connection As SqlConnection

Protected Sub New(ByVal connect As String)
_connection = New SqlConnection(connect)
End Sub

Protected ReadOnly Property Connection() As SqlConnection
Get
Return _connection
End Get
End Property

Public Sub Dispose() Implements IDisposable.Dispose
_connection.Dispose()
End Sub

End Class
End Namespace
列表1.簡單基類

  在列表中可以看到,對DALBase類作了MustInherit標記(C#中的抽象),以確保它在繼承關係中使用。接著該類在公共建構函式中包括了一個例項化的私有SqlConnection物件,它接收連線字串作為一個引數。當來自IDisposable介面的Dispose方法確保連線物件已經被配置了的時候,受保護的(protected)Connection屬性允許衍生類訪問該連線物件。

  即使在下面簡化的例子中你也能開始看到抽象基類的用處:


Public Class WebData : Inherits DALBase
Public Sub New()
MyBase.New(ConfigurationSettings.AppSettings("ConnectString"))
End Sub

Public Function GetOrders() As DataSet
Dim da As New SqlDataAdapter("usp_GetOrders", Me.Connection)
da.SelectCommand.CommandType = CommandType.StoredProcedure
Dim ds As New DataSet()

da.Fill(ds)
Return ds
End Function
End Class

  在這種情況下,WebData類繼承自DALBase,結果就是不必擔心例項化SqlConnection物件,而是通過MyBase關鍵字(或者C#中的基關鍵字)簡單地把連線字串傳遞給基類。WebData類的GetOrders方法能使用Me.Connection(在C#中是this.Connection)訪問受保護的屬性。雖然這個例子相對簡單,但是你將在規則2和3中看到基類也提供了其它的服務。

  當資料訪問層必須在COM+環境中執行時抽象的基類很有用。在這種情況下,因為允許元件使用COM+的必要程式碼複雜得多,所以更好的方式是建立一個如列表2所示的服務元件(serviced component)基類。


<ConstructionEnabled(True), _
Transaction(TransactionOption.Supported), _
EventTrackingEnabled(True)> _
Public MustInherit Class DALServicedBase : Inherits ServicedComponent

Private _connection As SqlConnection

Protected Overrides Sub Construct(ByVal s As String)
_connection = New SqlConnection(s)
End Sub

Protected ReadOnly Property Connection() As SqlConnection
Get
Return _connection
End Get
End Property
End Class
列表2.服務元件基類

  在這段程式碼中,DALServicedBase類包含的基本功能與列表1中的相同,但是加上了從System.EnterpriseServices名字空間的ServicedComponent的繼承,並且包括了一些屬性,指明元件支援物件構造、事務和靜態跟蹤。接著該基類仔細地捕捉元件服務管理器(Component Services Manager)中的構造字串並且再次建立和暴露SqlConnection物件。我們要注意的是當一個類繼承自DALServicedBase時,它也繼承了屬性的設定。換句話說,一個衍生類的事務選項也設定為Supported。如果衍生類想過載這種行為,它能在類的層次重新定義該屬性。

  此外,衍生類在適當情況下應該有利於自身過載和共享方法。使用過載的方法(一個方法有多個呼叫訊號)在本質上有兩種情況。首先,它們在一個方法需要接受多種型別的引數時使用。框架元件中的典型例子是System.Convert類的方法。例如ToString方法包含18個接受一個引數的過載方法,每個過載方法的型別不同。其次,過載的方法用於暴露引數數量不斷增長的訊號,而不是不同型別的必要引數。在資料訪問層中這類過載變得效率很高,因為它能用於為資料檢索和修改暴露交替的訊號。例如GetOrders方法可以過載,這樣一個訊號不接受引數並返回所有訂單,但是附加的訊號接受引數以表明呼叫程式希望檢索特定的顧客訂單,程式碼如下:


Public Overloads Function GetOrders() As DataSet
Public Overloads Function GetOrders(ByVal customerId As Integer) As DataSet

  這種情況下的一個好的實現技巧是抽象GetOrders方法的功能到一個能被每個過載訊號呼叫的私有的或者受保護的方法中。

  共享方法(C#中的靜態方法)也能用於暴露資料訪問類的所有例項能夠訪問的欄位、屬性和方法。儘管共享成員不能與使用元件服務(Component Services)的類一起使用,但是對於在資料訪問類的共享建構函式中檢索並被所有例項讀取的只讀資料是有用的。使用共享成員讀/寫資料時要小心,因為為了訪問該共享資料,執行的多個執行緒可能會競爭。

規則2:堅持設計指導

  隨Visual Studio .NET一起釋出的線上文件中有一個叫"類庫開發人員的設計指導(Design Guidelines for Class Library Developers)"的主題,它覆蓋了類、屬性和方法的名字轉換,是過載的成員、建構函式和事件的補充模式。你必須遵循名字轉換的主要原因之一是.NET框架元件提供的跨語言(cross-language)繼承。如果你在Visual Basic .NET中建立一個數據訪問層基類,你想確保使用.NET框架元件相容的其它語言的開發人員能繼承它並容易理解它怎樣工作。通過堅持我概述的指導方針,你的名字轉換和構造就不會是語言特定的(language specific)。例如,你可能注意到在本文例子的程式碼中第一個詞小寫,並加上intercaps是用於方法的引數的,每個詞大寫是用於方法的,基類使用Base標誌來標識它是一個抽象類。

  可以推測.NET框架元件設計指導都是普通設計模式,像Gang of Four (Addison-Wesley, 1995)寫的Design Patterns記載的一樣。例如.NET框架元件使用了Observer模式的一個變體,叫做Event模式,在類中暴露事件時你必須遵循它。

  規則3:利用基礎結構(Infrastructure)

  .NET框架元件包括一些類和構造,它們能輔助處理通常的與基礎結構相關的事務,例如裝置和異常處理。通過基類把這些概念與繼承組合起來將非常強大。例如,你能考慮一下System.Diagnostics名字空間中暴露的跟蹤功能。除了提供Trace和Debug類外,該名字空間還包括衍生自Switch和TraceListener的類。Switch類的BooleanSwitch和TraceSwitch能被配置用於開啟和關閉應用程式和配置檔案,在TraceSwitch中可以暴露多層次跟蹤。TraceListener類的TextWriterTraceListener和EventLogTraceListener分別將Trace和Debug方法的輸入定位到文字檔案和事件日誌。

  這樣作的結果是給基類添加了跟蹤功能,使衍生類記錄訊息日誌更簡單。接著應用程式能使用配置檔案控制是否允許跟蹤。你能包括一個BooleanSwitch型別的私有變數並在建構函式中例項化它來給列表1中的DALBase新增這個功能:


Public Sub New(ByVal connect As String)
_connection = New SqlConnection(connect)
_dalSwitch = New BooleanSwitch("DAL", "Data Access Code")
End Sub

  傳遞給BooleanSwitch的引數包括名字和描述。接著你能新增一個受保護的屬性開啟和關閉開關,也能新增一個屬性使用Trace物件的WriteLineIf方法格式化並寫入跟蹤訊息:


Protected Property TracingEnabled() As Boolean
Get
Return _dalSwitch.Enabled
End Get
Set(ByVal Value As Boolean)
_dalSwitch.Enabled = Value
End Set
End Property

Protected Sub WriteTrace(ByVal message As String)
Trace.WriteLineIf(Me.TracingEnabled, Now & ": " & message)
End Sub

  通過這種途徑,衍生類自己並不知道開關(switch)和監聽(listener)類,當資料訪問類產生一個有意義的訊號時能夠簡單地呼叫WriteTrace方法。


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<switches>
<add name="DAL" value="1" />
</switches>
<trace autoflush="true" indentsize="4">
<listeners>
<add name="myListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="DALLog.txt" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
列表3.跟蹤的配置檔案

  為了建立一個監聽器並開啟它,需要使用應用程式配置檔案。列表3顯示了一個簡單的配置檔案,它能夠開啟剛才顯示的資料訪問類開關,並通過myListener呼叫TextWriterTraceListener把輸出定位到檔案DALLog.txt中。當然,你能通過從TraceListener類衍生程式化地建立監聽器並把該監聽器直接包含在資料訪問類中。


Public Class DALException : Inherits ApplicationException
Public Sub New()
MyBase.New()
End Sub

Public Sub New(ByVal message As String)
MyBase.New(message)
End Sub

Public Sub New(ByVal message As String, ByVal innerException As
Exception)
MyBase.New(message, innerException)
End Sub
'在這兒新增自定義成員
Public ConnectString As String
End Class
列表4.自定義異常類

  你從中收益的第二個基礎結構是結構化異常處理(SEH)。在最基本的層次,資料訪問類能夠暴露它的衍生自System.ApplicationException 的Exception(異常)物件並能進一步暴露自定義成員。例如,列表4中顯示的DALException物件能用於包裝資料訪問類中的程式碼產生的異常。接著基類能暴露一個受保護的方法包裝該異常,組裝自定義成員,並把它發回給呼叫程式,如下所示:


Protected Sub ThrowDALException(ByVal message As String, _
ByVal innerException As Exception)
Dim newMine As New DALException(message, innerException)

newMine.ConnectString = Me.Connection.ConnectionString
Me.WriteTrace(message & "{" & innerException.Message & "}")
Throw newMine
End Sub

  使用這種方法,衍生類能簡單地呼叫受保護的方法,傳遞進去一個特定的資料異常(典型的有SqlException或者 OleDbException),該異常被擷取並添加了從屬於特定資料域的訊息。基類在DALException中包裝該異常並把它發回到呼叫程式。這就允許呼叫程式用一個Catch語句輕易地捕捉所有來自資料訪問類的異常。

  作為選擇之一,你可以看一看MSDN上釋出的"Exception Management Application Block Overview"。該框架元件通過一系列物件結合了異常和應用程式日誌記錄。實際上,通過從.NET 框架元件提供的BaseApplicationException類衍生的自定義異常類能夠簡單地插入該框架元件。

規則4:仔細選擇外部介面

  在你設計資料訪問類的方法時,需要考慮它們怎樣接受和返回資料。對大多數開發人員來說,主要有三個選擇:直接使用ADO.NET物件、使用XML、使用自定義類。

  如果直接暴露ADO.NET物件,你能使用一到兩個程式設計模型。第一個包括資料集和資料表物件,它們對不連線資料訪問很有用。有很多關於資料集和與它關聯的資料表的文章,但是當你必須使用從下層資料儲存斷開的資料時它才最有用處。換句話說,資料集能在應用程式各層之間傳遞,即使那些層在物理上是分散式的,當業務和資料服務層放置在同一群伺服器上並且與表現服務分開時也能使用。此外,資料集物件是通過基於XML的Web服務返回資料的理想方法,因為它們是可序列化的,因此能在SOAP迴應訊息中返回。

  這與使用實現IDataReader介面的類(例如SqlDataReader 和OleDbDataReader)訪問資料不同。資料閱讀器(data reader)用只向前的,只讀的方式訪問資料。兩者之間最大的不同是資料集和資料表物件能在應用程式域之間傳遞,通過傳遞值(by value)實現,然而資料閱讀器能在各處傳遞,但是一般通過引用(by reference)實現。在列表5中,Read和GetValues在伺服器過程中執行並且它們的返回值複製到客戶端。

  該圖顯示了資料閱讀器怎樣存活在應用程式域中,它在那兒它被建立,並且對它的所有訪問結果都在客戶端和伺服器應用程式域之間的迴圈之中。這意味著當資料訪問方法在相同的應用程式域執行時,應該返回資料閱讀器作為呼叫者。

  使用資料閱讀器時有兩個問題需要考慮。首先,當你從資料訪問類的一個方法返回資料閱讀器時,你必須考慮與資料閱讀器關聯的連線物件的生存期。預設情況是當呼叫程式通過資料閱讀器重複時連線仍然是忙的,不幸的是當呼叫程式結束後,連線仍然開啟,因此它不返回到連線池(如果允許連線池)。但是,當通過傳遞CommandBehavior.CloseConnection 列舉給command物件的ExecuteReader方法,連線的Close方法被呼叫時,你能命令資料閱讀器關閉它的連線。

  其次,為了把表現層從特定的框架元件資料提供程式(例如SqlClient或者OleDb)中分離出來,呼叫程式碼應該使用IDataReader介面(例如SqlDataReader)而不是具體型別來引用返回值。通過這種方法,如果應用程式後端從Oracle移植到 SQL Server,或者資料訪問類的一個方法的返回型別改變了,表現層也不需要更改。

  如果你希望資料訪問類返回XML,你可以從System.Xml名字空間中的XmlDocument和XmlReader中選擇一個,它與資料集和IDataReader類似。換句話說,當資料從資料來源斷開時你的方法應該返回一個XmlDocument(或者XmlDataDocument),然而XmlReader可用於訪問XML資料的流。

  最後,你也能決定與公共屬性一起返回自定義類。這些類可以使用Serialization(序列化)屬性標記,這樣它們就能跨越應用程式域複製。另外,如果你從方法中返回多個物件,就需要強化型別(strongly typed)的集合類。


Imports System.Xml.Serialization

<Serializable()> _
Public Class Book : Implements IComparable
<XmlAttributeAttribute()> Public ProductID As Integer
Public ISBN As String
Public Title As String
Public Author As String
Public UnitCost As Decimal
Public Description As String
Public PubDate As Date

Public Function CompareTo(ByVal o As Object) As Integer _
Implements IComparable.CompareTo
Dim b As Book = CType(o, Book)
Return Me.Title.CompareTo(b.Title)
End Function
End Class

Public NotInheritable Class BookCollection : Inherits ArrayList
Default Public Shadows Property Item(ByVal productId As Integer) _
As Book
Get
Return Me(IndexOf(productId))
End Get
Set(ByVal Value As Book)
Me(IndexOf(productId)) = Value
End Set
End Property

Public Overloads Function Contains(ByVal productId As Integer) As _
Boolean
Return (-1 <> IndexOf(productId))
End Function

Public Overloads Function IndexOf(ByVal productId As Integer) As _
Integer
Dim index As Integer = 0
Dim item As Book

For Each item In Me
If item.ProductID = productId Then
Return index
End If
index = index + 1
Next
Return -1
End Function

Public Overloads Sub RemoveAt(ByVal productId As Integer)
RemoveAt(IndexOf(productId))
End Sub

Public Shadows Function Add(ByVal value As Book) As Integer
Return MyBase.Add(value)
End Function
End Class
列表6.使用自定義類

  上列表(列表6)包含了一個簡單的Book類和與它關聯的集合類的例子。你能注意到Book類用Serializable做了標記,使它跨越應用程式域能使用"by value"語法。該類實現了IComparable介面,因此當它包含在一個集合類中的時候,預設情況下它將按Title排序。BookCollection類從System.Collections名字空間的ArrayList衍生,並且為了將該集合限制到Book物件而隱藏了Item屬性和ADD方法。

  通過使用自定義類你完全地控制了資料的表現、開發人員的效率並且沒有依賴ADO.NET的呼叫。但是這種途徑需要更多的程式碼,因為.NET框架元件沒有包含任何與物件相關的技術對映。在這種情況下,你應該在資料訪問類中建立一個數據讀取器並使用它來組合自定義類。

規則5:抽象.NET框架元件資料提供程式

  最後一條規則說明了為什麼和怎樣抽象資料訪問類內部使用的.NET框架元件資料提供程式(data provider)。先前我說過ADO.NET程式設計模型暴露了特定的.NET框架元件資料提供程式,包括SqlClient、OleDb和其它MSDN Online Web站點上可用的。但是這種設計的結果是提高效能,為資料提供程式暴露特定資料來源功能的能力,它強迫你決定使用那種資料提供程式編碼。換句話說,開發人員典型地會選擇使用SqlClient或OleDb,接著在各自的名字空間直接對它們的類進行程式設計。

  如果你想改變.NET框架元件資料提供程式,你必須重新編寫資料訪問方法。為了避免這種情況發生,你可以使用Abstract Factory設計模式。使用這種模式,你能建立一個簡單的類,它暴露方法來建立主要的.NET框架元件資料提供程式物件(command、connection、data adapter和parameter),而那些物件基於傳遞給建構函式的.NET框架元件資料提供程式的資訊。列表7中的程式碼就是這樣一個簡單的類。


public enum ProviderType :int {SqlClient = 0, OLEDB = 1}

public class ProviderFactory {
public ProviderFactory(ProviderType provider) {
_pType = provider;
_initClass();
}

public ProviderFactory() {
_initClass();
}

private ProviderType _pType = ProviderType.SqlClient;
private bool _pTypeSet = false;
private Type[] _conType, _comType, _parmType, _daType;


private void _initClass() {
_conType = new Type[2];
_comType = new Type[2];
_parmType = new Type[2];
_daType = new Type[2];

// 為提供程式初始化型別
_conType[(int)ProviderType.SqlClient] = typeof(SqlConnection);
_conType[(int)ProviderType.OLEDB] = typeof(OleDbConnection);
_comType[(int)ProviderType.SqlClient] = typeof(SqlCommand);
_comType[(int)ProviderType.OLEDB] = typeof(OleDbCommand);
_parmType[(int)ProviderType.SqlClient] = typeof(SqlParameter);
_parmType[(int)ProviderType.OLEDB] = typeof(OleDbParameter);
_daType[(int)ProviderType.SqlClient] = typeof(SqlDataAdapter);
_daType[(int)ProviderType.OLEDB] = typeof(OleDbDataAdapter);
}

public ProviderType Provider {
get {
return _pType;
}
set {
if (_pTypeSet) {
throw new ReadOnlyException("Provider already set to "
+ _pType.ToString());
}
else {
_pType = value;
_pTypeSet = true;
}
}
}
public IDataAdapter CreateDataAdapter(string commandText,IDbConnection
connection) {
IDataAdapter d;
IDbDataAdapter da;

d = (IDataAdapter)Activator.CreateInstance(_daType[(int)_pType],
false);
da = (IDbDataAdapter)d;
da.SelectCommand = this.CreateCommand(commandText, connection);
return d; }

public IDataParameter CreateParameter(string paramName, DbType
paramType) {
IDataParameter p;
p = (IDataParameter)Activator.CreateInstance(_parmType[(int)_pType],
false);
p.ParameterName = paramName;
p.DbType = paramType;
return p;
}

public IDataParameter CreateParameter(string paramName, DbType
paramType, Object value) {
IDataParameter p;
p = (IDataParameter)Activator.CreateInstance(_parmType[(int)_pType],
false);
p.ParameterName = paramName;
p.DbType = paramType;
p.Value = value;
return p;
}

public IDbConnection CreateConnection(string connect) {
IDbConnection c;
c = (IDbConnection)Activator.CreateInstance(_conType[(int)_pType],
false);
c.ConnectionString = connect;
return c;
}

public IDbCommand CreateCommand(string cmdText, IDbConnection
connection) {
IDbCommand c;
c = (IDbCommand)Activator.CreateInstance(_comType[(int)_pType],
false);
c.CommandText = cmdText;
c.Connection = connection;
return c;
}
}
列表7. ProviderFactory

  為了使用該類,資料訪問類的程式碼必須對多個.NET框架元件資料提供程式實現的介面(包括IDbCommand、IDbConnection、IDataAdapter和IDataParameter)進行程式設計。例如,為了使用一個引數化儲存過程的返回值來填充資料集,必須在資料訪問類的某個方法中有下面的程式碼:


Dim _pf As New ProviderFactory(ProviderType.SqlClient)
Dim cn As IDbConnection = _pf.CreateConnection(_connect)
Dim da As IDataAdapter = _pf.CreateDataAdapter("usp_GetBook", cn)

Dim db As IDbDataAdapter = CType(da, IDbDataAdapter)
db.SelectCommand.CommandType = CommandType.StoredProcedure
db.SelectCommand.Parameters.Add(_pf.CreateParameter("@productId",DbType.Int32, id))

Dim ds As New DataSet("Books")
da.Fill(ds)

  典型的情況是你在類的層次宣告ProviderFactory變數並在資料訪問類的建構函式中例項化它。另外,它的建構函式與從配置檔案中讀取的提供程式一起組裝,而不應該是硬程式碼。你可以想象,ProviderFactory是資料訪問類的一個重大的補充,並且能被包括進部件,分發給其它的開發人員。

  結論

  在Web服務時代將建立越來越多的應用程式操作來自獨立的應用程式層的資料。如果你遵循一些基本規則並形成習慣,編寫資料訪問程式碼將更快、更容易,並且更能重新使用,把你的錯誤儲存到伺服器,允許你保持資料獨立。

相關推薦

設計.NET應用程式資料訪問五大原則

摘要:大多數使用.NET框架元件工作的開發人員的一個核心工作是實現資料訪問功能,他們建立的資料訪問層(data access layer)是應用程式的精華部分。本文概述了使用Visual Studio .NET和.NET框架元件建立資料訪問層需要考慮的五個想法。這些技巧包括通過使用基類(base class)

剖析 .Net 下的資料訪問技術

自從 .NET 真正走入開發人員那天起,“效率”兩個字就一直成為眾多程式設計師津津樂道的話題。無論是從開發模式(Cross Language)、系統框架(.NET Framework),還是各種使用方便的工具(VS.NET),無一不體現出了它的勝人一籌。 同時,在另一方面,.

.Net企業級應用架構設計資料訪問

綜述資料訪問層的設計很大程度上取決於專案干係人需求的影響。例如,資料訪問層應該持久化物件模型還是簡單的的值的集合?資料訪問層應該支援一種資料庫還是多種資料庫?下面仔細分析資料訪問層的常見功能需求。資料庫

基於Spring4+Hibernate4的通用資料訪問(Dao設計與實現!

基於泛型的依賴注入。當我們的專案中有很多的Model時,相應的Dao(DaoImpl),Service(ServiceImpl)也會增多。而我們對這些Model的操作很多都是類似的,下面是我舉出的一些(見名知意,其它自行腦補): 1.save 2.saveAll 3.fin

解析.NET物件的跨應用程式訪問(下篇)

    轉眼就到了元宵節,匆匆忙忙的腳步是我們在為生活奮鬥的寫照,新的一年,我們應該努力讓自己有不一樣的生活和追求。生命不息,奮鬥不止。在上篇博文中主要介紹了.NET的AppDomain的相關資訊,在本篇博文中將會主要說明.NET程式集、物件代理,以及物件的封送原理。 一.

資料訪問設計和實現(分散式系統七)

(1)如何對外提供資料訪問層的功能 資料訪問層就是方便應用進行資料讀寫訪問的抽象層,在該層上解決各個應用通用的訪問資料庫的問題。 上圖顯示了三種方式,第一種是為使用者提供專有API,不過不推薦,通用

橋接模式的應用之三架構中的業務邏輯(BLL)與資料訪問(DAL)的解耦

各層的作用  ①使用者介面層:只負責顯示和採集使用者操作。  ②業務邏輯層:負責UI和DAL層之間的資料交換,是系統架構中體現核心價值的部分。它關注點主要集中在業務規則的制定、業務流程的實現和業務需求的有關係統設計。它與系統所對應的領域(Domain)有關。也可以做一些如使用

ASP.NET MVC – 應用程式資料

Views 資料夾 Views 資料夾存有與應用程式的顯示相關的 HTML 檔案(使用者介面)。 Views 資料夾中含有每個控制器對於的一個資料夾。 Visual Web Developer 已建立了一個 Account 資料夾、一個 Home 資料夾、一個 Shared 資料夾(在 Views 資料夾內

關於面對物件過程中的三大架構以及資料訪問(實體類、資料操作類)

關於面對物件過程中的三大架構以及資料訪問層(實體類、資料操作類) 面向物件開發專案三層架構: 介面層、業務邏輯層、資料訪問層 資料訪問層,分為實體類和資料訪問類 在專案的下面新增一個App_Code資料夾把所有的類放在App_Code這個資料夾下邊。

《演算法設計應用資料結構回顧-樹

概念回顧 昨晚看到資料結構中的樹部分,現在回顧一下。   樹是資料結構裡面比較複雜,也比較有趣的一種。 對應的名稱很多,比如二叉樹,紅黑樹,B樹,B+樹等等 對應排序也挺多,前序,中序等等。   排序回顧 最近看到《演算法設計與應用》書裡面提到書的排序方式印象較深。 分為

IIS 7.0 的 ASP.NET 應用程式生命週期概述

    文章:IIS 7.0 的 ASP.NET 應用程式生命週期概述 地址:https://msdn.microsoft.com/zh-cn/library/bb470252(v=vs.100).aspx 本主題介紹在 IIS 7.0 整合模式下執行以及與 IIS 7.0 或更高

《大型網站系統與JAVA中介軟體實踐》 第五章 資料訪問

         兩階段提交                 &nbs

12-資料訪問

using Entity; using System.Data.SqlClient; using System.Data; public class CarDAL { /// <summary> /// 新增房車資訊 /// </summary> /// <param name

11-資料訪問

public class NewsDal { DBcontext db = new DBcontext(); /// <summary> /// 檢視釋出的所有資訊 /// </summary> /// <returns></returns> public

docker管理應用程式資料、容器網路

管理應用程式資料 Docker提供三種方式將資料從宿主機掛載到容器中: • volumes:Docker管理宿主機檔案系統的一部分(/var/lib/docker/volumes)。儲存資料的最佳方式。 • bind mounts:將宿主機上的任意位置的檔案或者目錄掛載到容器中。 • tmp

Spring Boot 基礎系列教程 | 第十二篇:使用Spring-data-jpa簡化資料訪問(推薦)

推薦 Spring Boot/Cloud 視訊: Spring Boot中使用Spring-data-jpa讓資料訪問更簡單、更優雅 在上一篇Spring中使用JdbcTemplate訪問資料庫 中介紹了一種基本的資料訪問方式,結合構建RESTful API和

使用IIS應用程式初始化來保持ASP.NET應用程式的活動

https://weblog.west-wind.com/posts/2013/Oct/02/Use-IIS-Application-Initialization-for-keeping-ASPNET-Apps-alive    2013年10月2日•來自毛伊島,HI• &

FileSystemWatcher 導致Mono ASP.NET應用程式CPU使用率比較高

大家都知道ASP.NET 網站應用程式(WebSite)可以自動檢測到你的ASP.NET應用的檔案修改,其中要使用到的就是監視磁碟上的檔案/目錄的更改,以便應用程式可以採取它認為必要檔案建立/刪除/修改事件的反應中的任何步驟的FileSystemWatcher 類。 Mono的 FileSystemWatc

.NET應用程式除錯:原理、工具、方法

閱讀目錄: 1.背景介紹 2.基本原理(Windows除錯工具箱、.NET除錯擴充套件SOS.DLL、SOSEX.DLL) 2.1.Windows除錯工具箱 2.2..NET除錯擴充套件包,SOS.DLL、SOSEX.DLL 2.3.除錯系統的基本流程及架構(.NETDAC概念、mscordacwks.

.NET應用程式除錯—原理、工具、方法

閱讀目錄: 1.背景介紹 2.基本原理(Windows除錯工具箱、.NET除錯擴充套件SOS.DLL、SOSEX.DLL) 2.1.Windows除錯工具箱 2.2..NET除錯擴充套件包,SOS.DLL、SOSEX.DLL 2.3.除錯系統的基本流程及架構(.NETDAC概念、msc