2012-02-20 22 views
0

我在C#和Razor中有一個ASP.NET MVC3。應用程序的體系結構分爲數據訪問層(EF類+存儲庫),服務層,控制器,視圖模型和視圖。如何從服務層訪問EF類屬性

從我的服務層ProductServices我調用該方法GetAllProducts暴露通過我的庫ProductRepository,其具有以下特徵:

IQueryable<Products> GetAllProducts() 

ProductServices我請因此(productRepositoryProductRepository一個實例):

var products = productRepository.GetAllProducts(); 

填充變量products。現在我想從productServices訪問產品名稱ProductName。如果我用這個指令:

var productNames = products.Select(m => m.ProductName).ToList(); 

ServiceLayerEF(繞過庫)之間建立連接。這意味着我必須補充到ProductRepository的方法有簽名:

IQueryable<string> GetAllProductsName() 

然而,因爲我在我的應用程序需要其他的產品信息,我將創建一個productRepository方法爲Product類的各個領域?我的推理是否正確?由於

+0

爲什麼你需要服務層,如果它只是代理請求? – Eranga 2012-02-20 11:49:46

+0

感謝您的回答。當然,我的服務層也有所有業務邏輯和幾種方法,這就是爲什麼我需要它 – CiccioMiami 2012-02-20 11:56:11

+0

是什麼讓你認爲這種耦合類型是不好的? – Eranga 2012-02-20 11:59:03

回答

1

即使世界各地的這兩個思想流派,

  1. 存儲庫明確定義你與數據庫進行交互,並應嚴格控制的方式。因此,存儲庫上的方法應提供列舉的數據。
  2. 存儲庫打破了與特定數據源類型的強耦合,但不需要提供詳細和枚舉的數據集。

我個人訂閱第二,繼承人爲什麼:

我的感覺是,當你在倉庫內得到明確的過度它變成商業邏輯,而不是分離機構。我不太喜歡這個,因爲這意味着你變得更緊密地聯繫到存儲庫實現。

我也認爲在某些情況下,存儲庫不是枚舉數據的正確位置,例如我相信分頁和排序是一個UI問題,但是對於要查詢的性能而言,您只希望查詢與當前頁面/排序相關。這意味着您需要讓用戶界面對查詢編譯作出貢獻,或者存儲庫需要了解分頁和排序。

話雖如此,提供未列舉的數據源確實會爲您解決後續問題提供幫助,即使您確實提供了儘快枚舉集合非常重要。

如果你有興趣我的繼承人採取的庫:http://blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html,所有的代碼也是在github

+0

感謝您的答案。因此,你建議我不要創建特定的方法並通過服務層訪問該字段,繞過存儲庫? – CiccioMiami 2012-02-20 12:01:57

+0

我的感覺是,通過直接訪問查詢,您實際上並未繞過存儲庫,因此您需要做一個運行時間擴展。所以是的,我會很好地使用一個選擇後,你從存儲庫中得到的設置。在這裏還需要注意的是,select實際上是LINQ的函數,而不是EF或者你的倉庫,它也很樂意在枚舉集合上工作。 – 2012-02-20 12:05:34

+0

,如果我事先知道數據庫(因此EF)將被替換?如果我只是從'productRepository'訪問字段,我必須改變這個層 – CiccioMiami 2012-02-20 12:38:18

0

您的productServices,因爲您從庫與方法productRepository.GetAllProducts加載所有信息全部信息()。如果您需要其他實體的更多信息,則需要使用新服務擴展您的產品服務。

然而,因爲我在我的應用程序需要其他的產品信息, 應創建爲 產品類的每個領域productRepository一個方法是什麼?我的推理是否正確?謝謝

在這種情況下,我通常爲服務創建擴展方法,而不是在存儲庫中。倉庫通常有一個CRUD設置,僅此而已。

+0

謝謝,這意味着你直接訪問服務層中的字段?當然,除了GetAllProducts之外,我還有其他方法,因爲它們沒有問題的範圍,所以我沒有在這裏列出。 – CiccioMiami 2012-02-20 14:14:07

+0

在這種情況下是的。如果您在其他應用程序或數據庫上下文(e.q WPF應用程序或移動應用程序)中需要此邏輯,則永遠不會。通過您的服務架構,您可以以一種好的方式處理這種情況。 – glenn 2012-02-20 17:21:58