3

我最近開始閱讀關於ASP.net MVC的內容,在對這個概念感到興奮之後,我開始將所有的webform項目遷移到MVC,但是我很難保持我的即使在遵循所有好的建議之後(或者我可能沒有得到它)​​,控制器仍然很瘦。 我處理的網站上有文章,視頻,報價...以及這些實體中的每一個都有可以與之關聯的類別,評論和圖片。我正在使用Linq來進行數據庫操作的sql,並且對於這些實體中的每一個,我都有一個存儲庫,並且對於每個存儲庫,我都會創建一個要在控制器中使用的服務。構建ASP.net MVC應用程序以使用存儲庫和服務

所以我有 -

  • ArticleRepository
  • ArticleCategoryRepository
  • ArticleCommentRepository

和相應的服務

  • ArticleService
  • ArticleCategoryService ...

你看到圖片。

這個問題我有是,我有一篇文章,類別和評論一個控制器,因爲我認爲有ArticleController處理所有的可能是有意義的,但現在我必須通過所有必需的控制器構造的服務。所以我想知道我做錯了什麼。我的服務設計不正確嗎?我應該創建更大的服務來封裝更小的服務並在我的控制器中使用它們嗎?或者我應該有一個articleCategory控制器和articleComment控制器?

用戶查看的頁面包含所有這些內容,要查看的文章,與其相關的註釋,適用的類別列表......我如何有效地將控制器分解爲保持它「瘦」,解決我的頭痛?

謝謝! 我希望我的問題不會太長......

+0

我的控制器目前有6-10 +依賴關係,我傳遞給構造函數。這也會導致龐大的控制器,但這是因爲我經常在單個頁面中顯示來自不同源的大量數據,並且所有數據都必須加載到視圖模型中。 –

回答

7

這是遵循單一責任模式的副作用。如果每個班級只是爲了一個目的而設計的,那麼你最終會得到很多班級。這是一個好的的事情。不要害怕它。從長遠來看,它將使您的生活更加輕鬆,以便更換組件以及調試系統的哪些組件不起作用。個人而言,我更喜歡將更多的域邏輯放在實際的域實體中(例如article.AddComment(comment)而不是articleCommentService.AddComment(article,comment)),但是您的方法也非常好。

+0

如果我顯示一篇文章及其相關的類別 - 評論圖片,我是否必須將它們全部放在一個單獨的控制器中才能正常工作?如何處理像文章這樣複雜的對象?我覺得使用你的方法(類別和評論是文章領域的一部分)可能會幫助我解決問題,同時使我遠離SRP ... – ak3nat0n

+0

我將擁有一個文章類,它具有屬性的類別,評論,圖像等等。這些會被延遲加載,所以當我只需要文章元數據時,不需要我從數據庫中獲取整個對象圖。這是否回答你的問題?我不確定我是否明白這是如何破壞SRP的。 SRP並不意味着相關實體不能相互引用。 –

+0

你是對的,他們可以互相參考,我沒有這樣想過。謝謝! – ak3nat0n

2

我認爲你正朝着正確的方向前進。問題是如何實例化你的服務?我不是MVC.NET專家,但已經完成了大量面向服務的Java項目以及您正在討論的模式。

在Java領域,我們通常會使用Spring來注入單例bean。

1)您可以使用依賴注入框架在.NET中執行相同的操作。

2)您可以在方法中根據需要實例化服務,如果它們足夠輕。

3)只要您將它們寫入線程安全,就可以在每個控制器中創建靜態服務成員,以減少對象流失。這是我在很多情況下使用的方法。

4)你甚至可以創建一個所有控制器都可以訪問的簡單的全局服務工廠,它可以簡單地是一類單例。

在.NET依賴注入方面也做了一些Google搜索。

相關問題