2009-07-14 50 views
4

我們正在開發一個使用ASP.NET MVC的相當大的應用程序,並且在開始時我們看到可能有一個帶有常見CRUD操作(新增,保存,刪除...)的抽象基本控制器以及一個默認列表操作。在我們的案例中,我們有20多個實體通過這種控制器進行管理。是一個抽象的CRUD控制器是一個好主意嗎?

這一工程,並避免重複一些代碼,使得應用更加均勻,但是當你看到一個控制器很難看出到底是哪個動作它實現,它可以實現不應該存在的一些行動。例如,假設你想編輯傳遞名稱而不是id,你必須創建一個新的EditByName(name),並且即使這樣做,仍然可以使用Edit(id)操作,因爲它在基礎中。

對我來說,整個事情的氣味一點點給我,但我還沒有發現顯示的替代,因爲MVC應用我看到有一個很窄的領域例如任何。有任何建議嗎?任何示例? (我不一定在ASP.NET MVC中,我認爲這個問題對於任何MVC框架都是非常通用的)。

回答

3

在某些方面,我認爲這是一個好主意,但在另一些方面,我認爲這是對繼承的濫用。我有一個共同的基礎控制器,但它的存在是因爲我已經從我的控制器中重構了通用代碼,而不是先驗設計。如果您的實體足夠類似於您在基本控制器中共享的代碼超過了您被迫拖動的垃圾,那麼也許這是值得的。另一方面,如果被共享的代碼非常小,並且只是調用一個可以完成工作的私有抽象方法(這樣您就可以在真實控制器中實現它),但我不知道它向您購買了什麼。這不像你直接實例化控制器(除了在你的測試中),所以擁有超出框架所需的通用接口並不是那麼重要。

我的投票將重構爲基類那些真正常見的或有橫切關注點,而不是東西試圖迫使一個「是」的關係可能並不存在。

1

這是一件事導軌和包裝(與生成您的相關CRUD意見一起)和它掀起了一個非常快速的應用程序是偉大的,但一旦你認真對待發展是的香草非常異常CRUD的東西留在因爲你需要爲每個表的東西開始改變,需要進一步的定製。

這並不是說它沒有形成一個有用的基礎和一個方便的方式來設置事情,而你正在開發和原型 - 比在數據庫字段中修補更容易 - 但肯定它的工作方式Rails不希望在最終的管理系統中包含任何這些頁面。

2

我創建了一個你正在建議的版本(雖然公認相對不是OOP),它對我來說工作得很好。

我創建了一個MasterController來設置一個數據庫實例和其他一些變量。一旦我開始審視我的CRUD操作中的相似之處,我意識到這可能會被抽象化,並轉化爲主人內部的一種方法。實際上有兩種方法。

protected ActionResult DisplayValidateAndEditModel<TModel>(TModel model, string modelPrefix, 
             string editViewName, string successActionName, object routeValues, string successMessage, 
             string[] includeProperties, bool acceptFiles 
           ) where TModel : class 

protected ActionResult DisplayValidateAndEditModel<TModel>(TModel model, string modelPrefix, 
             string editViewName, string successActionName, string successMessage, 
             string[] includeProperties 
           ) where TModel : class 

編輯涵蓋創建/讀取/更新和刪除被刪除。列表是一個控制器中的單行 - 我只是得到一組模型並添加到viewdata。

兩種方法都檢查它是否是帖子。如果不是,他們返回視圖。如果是這樣的話:

  • 編輯調用TryUpdateModel,也做一些xVal驗證。如果一切正常,則使用任何routeValues重定向到successAction。如果不是,它再次顯示視圖。可以傳遞includeProperties,以便我的控制器可以精確指定可以獲取更新的內容。 acceptFiles在尋找文件發佈的地方添加了額外的功能,如果存在的話,它將它放入數據庫並在文件記錄和模型之間創建一個鏈接。

  • 刪除更新模型的CANCEL_DATE和Cancel_User屬性(我有一個ICancelable接口)和重定向到成功的行動

0

對我來說,整個事情味道有點..

同樣的氣味在這裏:-)

在控制器中使用少量代碼是很常見的做法。它的主要目的是決定下一次使用哪個模型渲染View。

如果您希望所有控制器代碼具有共同的地方,那麼您可能需要在控制器中有很多邏輯。

嘗試將logik移動到模型中。使用過濾器和CustomModelBinder。

+0

我們使用過濾器,豐富的模型和模型活頁夾。這些控制器非常簡單而且很薄,但除了一些細微的差別之外,它們都是一樣的。 – 2009-07-14 17:14:38

相關問題