[英]Data Access Layer
我們如何創建一個通用數據訪問層,供使用不同數據源提供程序或Web服務的任何asp.net應用程序使用?
我們可以為使用Web服務的應用程序創建數據訪問層嗎?
您可能會查看存儲庫模式。 存儲庫是一個外觀,用於呈現持久對象,就好像它們在內存中的集合中一樣。 您選擇獲取數據的任何提供程序都隱藏在“存儲庫”界面的后面。
您有很多選擇! :-)
您提到要使用來自asp.net和Web服務的數據訪問層(DAL)。 沒問題。
基本上,您需要弄清楚的是要遵循的基本設計,並將DAL封裝到其自己的程序集中,該程序集可以被各種使用者使用/引用。
有很多方法可以做到這一點:
您最大的挑戰是定義一種標准的做事方法並堅持下去。
看一些文章-也許他們會給你一個想法:
請嘗試在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.