簡體   English   中英

資料存取層

[英]Data Access Layer

我們如何創建一個通用數據訪問層,供使用不同數據源提供程序或Web服務的任何asp.net應用程序使用?

我們可以為使用Web服務的應用程序創建數據訪問層嗎?

您可能會查看存儲庫模式。 存儲庫是一個外觀,用於呈現持久對象,就好像它們在內存中的集合中一樣。 您選擇獲取數據的任何提供程序都隱藏在“存儲庫”界面的后面。

使用LINQ to SQL的IRepository

代碼項目教程

Fredrik Kalseth的樣本

您有很多選擇! :-)

您提到要使用來自asp.net和Web服務的數據訪問層(DAL)。 沒問題。

基本上,您需要弄清楚的是要遵循的基本設計,並將DAL封裝到其自己的程序集中,該程序集可以被各種使用者使用/引用。

有很多方法可以做到這一點:

  • 如果您使用SQL Server作為后端,則為表創建一個Linq-to-SQL映射,並使用Linq-to-SQL實體和方法
  • 創建一個存儲庫模式(對於每個“實體”,您都有一個“ EntityRepository”類,可用於檢索實體,例如EntityReposity.GetByID(int id)或EntityRepository.GetByForeignKey(string fk)或其他內容
  • 使用其他方式訪問數據(NHibernate,您自己的基於ADO.NET的映射器)
  • 您實際上還可以使用網絡服務調用作為數據提供者

您最大的挑戰是定義一種標准的做事方法並堅持下去。

看一些文章-也許他們會給你一個想法:

請嘗試在www.asp.net上的教程:

數據訪問

看一下使用接口:

IDbConnection IDbCommand IDbDataAdapter IdataReader

哇,那里有很多資源。 最好的開始建議是找到一個適合您的模式,並堅持該項目,然后再以3/4的方式改變主意,這沒有比這更糟糕的了。

我發現並喜歡使用的一種是存儲庫或提供程序模式。 存儲庫模式只是確保您可以對存儲庫(例如商店目錄或CMS系統)進行標准訪問。 您創建的接口在我的情況下公開了IQueryable對象或數據模型的集合,只是帶有額外絨毛POCO(普通的舊CLR對象)的標准c#類。

public interface ICMSRepository {
    IQueryable<ContentSection> GetContentSections();
    void SaveContentSection(ContentSection obj);
}

然后只需為您的不同提供程序實現接口,例如LINQ to SQL上下文,確保將POCO對象返回為可查詢的。 這樣做的好處是,您可以使IQueryable之外的擴展方法輕松獲得所需的內容。 喜歡:

public static IQueryable<ContentSection> WithID(this IQueryable<ContentSection> qry, int ID) {
    return from c in qry select c;
}

//Allow you to chain repository and filter to delay SQL execution
ICMSRepository _rep = new SqlCMSRepository();
var sec = _rep.GetContentSections().WithID(1).SingleDefault();

使用接口方法的好處是能夠對其進行測試和模擬,或者在運行時依賴項注入您喜歡的存儲。

我已經使用並且在ASP.Net框架中經常使用的另一種方法是提供程序模型。 除了創建單個抽象類而不是創建接口之外,這是相似的,然后您在抽象類之上的實現將定義存儲訪問方式(XML,平面文件,SQL,MySql等)。 基本抽象類也將負責基於配置創建它的單例。 請查看此內容以獲取有關提供程序模型的更多信息

否則,您可以看看這個類似的問題

IRepository是T的一般好方法。 該接口應公開GetAll,GetByID,Insert,Delete和Submit方法。
但是,重要的是要使您的業務邏輯不屬於Repository類,而應將其置於自定義邏輯/服務類中。
同樣,如果您在GetAll方法中返回IQueriable,則可以在IRepository的各種實現中經常看到,UI層也可以查詢該IQueriable接口。 但是對象圖的查詢應保留在存儲庫層中。 關於這個問題有很多爭論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM