簡體   English   中英

為ASP.NET MVC項目設置數據訪問的最佳方法是什么?

[英]What's the best way to set up data access for an ASP.NET MVC project?

我正在開始一個新的ASP.NET MVC項目來學習,並且想知道設置項目連接到SQL服務器以獲取數據的最佳方式是什么。 例如,假設我們有一個Product表和一個產品對象,我想用它來填充視圖中的數據。

我知道在這里的某個地方我應該有一個實現的接口等,但我今天無法繞過它:-(

編輯:現在(即:這個應用程序的當前,編碼不佳的版本)我只使用普通的舊SQL服務器(2000甚至)只使用存儲過程進行數據訪問,但我不會添加額外的一層使用linq到sql或其他東西的靈活性。

編輯#2:我想添加的一件事是:我將針對數據庫的V1寫這個,我需要能夠讓我們的DBA重新運行數據庫並稍后給我一個V2,所以它很高興真的只需要改變一些現在不會通過數據庫提供的小東西。 而不是必須重寫一個全新的DAL。

這實際上取決於您使用的數據訪問技術。 如果您正在使用Linq To Sql,您可能希望抽象出某種“存儲庫”接口背后的數據訪問,例如IProductRepository。 對此的主要吸引力在於您可以隨時更改特定的數據訪問實現(例如在編寫單元測試時)。

我試圖在這里介紹一些內容:

我會查看Rob Conery關於他創建MVC商店前台視頻。 該系列可在此處找到: MVC Store Front Series

本系列課程涉及各種與設計相關的主題,以及用於MVC和其他項目的編碼/測試實踐。

在我的網站解決方案中,我有一個MVC Web應用程序項目和一個包含我的POCO(簡單的'C#對象),業務經理和數據訪問層的“通用”項目。

DAL類與SQL Server綁定(我沒有將它們抽象出來)並將POCO返回給我從MVC項目中的控制器調用的業務經理。

我做了一些MVC應用程序,我找到了一個非常適合我的結構。 它基於Rob Conery的MVC店面系列 ,JPrescottSanders提到(雖然他發布的鏈接是錯誤的)。

所以這里 - 我通常試圖限制我的控制器只包含視圖邏輯。 這包括檢索要傳遞給視圖的數據以及從視圖傳回到域模型的數據的映射。 關鍵是嘗試將業務邏輯保留在此層之外。

為此,我通常在我的應用程序中最終得到3層。 第一個是表示層 - 控制器。 第二個是服務層 - 該層負責執行復雜查詢以及驗證等事務。 第三層是存儲庫層 - 該層負責對數據庫的所有訪問。

因此,在您的產品示例中,這意味着您將擁有一個ProductRepository,其中包含GetProducts()和SaveProduct(Product product)等方法。 您還可以使用GetProductsForUser(用戶用戶),GetProductsWithCategory(類別類別)和SaveProduct(產品產品)等方法獲得ProductService(依賴於ProductRepository)。 像驗證這樣的事情也會發生在這里。 最后,您的控制器將依賴於您的服務層來檢索和存儲產品。

您可以跳過服務層,但通​​常會發現您的控制器變得非常胖並且往往做得太多。 我已經嘗試過這種架構很多次了,它的工作效果非常好,特別是因為它支持TDD和自動化測試。

我認為Billy McCafferty的S#arp架構是一個非常好的例子,它使用帶有數據訪問層的ASP.NET MVC(默認使用NHibernate),依賴注入(Ninject atm,但有計划支持CommonServiceLocator)和測試 -推動發展。 該框架仍處於開發階段,但我認為它非常好且穩定。 從當前版本開始,在最終版本發布之前應該沒有什么重大變化,因此對它進行編碼應該沒問題。

對於我們的應用程序,我計划使用LINQ to Entities,但是對我來說這是新的,如果它不能按照我的意願執行並且使用LINQ to SQL之類的其他內容,我將來可能希望替換它。 NHibernate,所以我將數據訪問對象抽象為抽象工廠,以便實現隱藏在應用程序中。

你如何做到這一點取決於你,只要你選擇一個經過驗證和熟知的設計模式來實現我認為你的最終產品將得到很好的支持和強大。

查看Code Camp服務器以獲得一個很好的參考應用程序,它可以完成這項工作,並且@haacked聲明了抽象,以保持它們分離。

我想你需要一個人。

例如實體框架(代碼優先)

你可以為模型創建一些類。

使用這些模型進行邏輯和視圖,並將它們映射到db(v1)。

當dba給你新的db(v2)時,只更改映射配置。(v1和v2都是rdb,sql server,mysql,oracel ...),如果db(v1)是rdb而db(v2)是nosql(mongo,redis,couchbase ......),這不行

可能需要做一些尋找和替換

使用LINQ。 創建LINQ to SQL文件並拖放所需的所有表和視圖。 然后,當您調用模型時,將自動為您創建所有CRUD級別的內容。

LINQ是我在很長一段時間里見過的最好的東西。 以下是一些從Scott Gu的博客中獲取數據的簡單示例。

LINQ教程

我剛剛完成了我的第一個MVC項目,並使用了Service-Repository設計模式。 現在網上有很多關於它的信息。 它使我從Linq-> Sql過渡到Entity Framework毫不費力。 如果您認為自己將要進行大量更改,那么可以使用Interfaces。

我推薦您的DAL / Repository的Entity Framework。

暫無
暫無

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

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