2017-10-13 60 views
3

我有一個快速的問題,最佳實踐ASP.NET控制器常用操作

在這樣的例子很多,我看到控制器操作不返回任何搜索或Partialview也被添加在相同的控制器 - 在我的情況現在我有多個控制器,我需要運行相同的動作,例如

  • 控制器A將運行動作甲
  • 控制器B將運行動作甲

在控制器A和B中添加操作A看起來不正確。

正如我正在使用AJAX的行動[HttpPost]通話,因此,我想這是在方便POST訪問控制器,雖然我不想增加同樣的行動在兩個控制器

我可以在控制器A添加一個動作,讓控制器B訪問相同的動作,從控制器A而是要求,但我在想什麼

**怎麼樣,如果我創建一個新的控制器稱爲

commonActionContoller

,並把「行動」中,並讓一切使用commonActionContoller是必須採取行動,當**

乾杯

編輯:?實例添加如下

一個示例應用其中人員和國家,所以人的模型是相同的所有國家,但我們有不同的控制器爲每個國家,所以如果管理員想要更新人的模型與字段IsEmpoyed從真到假,然後他們去例如{美國} /索引控制器和s女巫真假。現在,對於{AUS}/Index和{China}/Index,這是相同的,所以將IsEmpyed更改爲true/false的操作在所有控制器中都是相同的。爲了使這項工作,我不想添加行動IsEmplyed到所有的國家控制器 - (想不到更好的例子) -

+2

「行動」實際上做了什麼? –

+0

您指定的方法聽起來可行。一個'CommonActionController',用於從其他幾個控制器動作中調用通用動作。 – shahsani

+0

@deezg獲取數據並設置數據(如果需要)並在需要時返回數據 – aliusman

回答

0

的指導原則,這裏應該是分離的擔憂。

如果ControllerA和ControllerB具有特定的業務邏輯,並且添加CommonActions控制器給共享數據一個好的孤立的家庭,這是一個很好的做法。

雖然很難回答,但沒有更好地說明您的需求。

一個稍微好一點的例子可能是順序應用程序:

InventoryController EmployeeController

你可能不想用類似方法一CommomController:

GetStoreClosingHours(int storeNumber); 
GetTotalSales(int employeeId); 
GetEmployeeComps(int employeeId); 

的IoC和依賴注入可能支付取決於行動。凡任何控制器可以調用類似的方法:

GetLastLogonTime(thisEmployee); 

這真是一組畢竟在設計應用程序的原則和最佳實踐,並不總是超級整齊的包裝。我會說最重要的是選擇一些靈活的,可擴展的,然後堅持下去。

+0

這是有道理的,一個具有Person和Countries的示例應用程序,所以Person模型對於所有國家都是相同的,但是我們對於每個國家都有不同的Controller。如果管理員想要將來自'true'的字段'IsEmpoyed'的Person模型更新爲'false',然後他們轉到例如{USA}/Index控制器,並切換爲false。現在,對於{AUS}/Index和{China}/Index,這是相同的,所以將IsEmpyed更改爲true/false的操作在所有控制器中都是相同的。爲了做到這一點,我不想添加Action IsEmplyed到所有的國家控制器 - (想不到更好的例子) – aliusman

+0

在這種情況下... IoC或繼承可能是一個很好的中間地帶....雖然國家真的與就業有關嗎? HrController可能不錯。 –

1

你應該在兩個控制器中寫行動A。否則它將違反Single responsibility principle。最佳做法是將實施代碼從Controller移動到服務層。例如,如果要加載的產品和子類別產品類別,那麼代碼將是這樣的:

public interface ICategoryService 
{ 
    List<Category> LoadCategory(); 
} 

public class CategoryService : ICategoryService 
{ 
    public List<Category> LoadCategory() 
    { 
     //code here 
    } 
} 

public class ProductController : Controller 
{ 
    private readonly ICategoryService _categoryService; 
    public ProductController() 
    { 
     _categoryService = <inject dependency here>; 
    } 

    public ActionResult GetCategory() 
    { 
     var category = _categoryService.LoadCategory(); 
    } 
} 

public class SubCategoryController : Controller 
{ 
    private readonly ICategoryService _categoryService; 
    public SubCategoryController() 
    { 
     _categoryService = <inject dependency here>; 
    } 

    public ActionResult GetCategory() 
    { 
     var category = _categoryService.LoadCategory(); 
    } 
} 
+0

我將不得不重複我的3個行動到8個不同的控制器 - 是不是隻是額外的代碼行 - 可能有更好的方法來處理這個?在8個不同的控制器上重複同樣的動作聽起來不太合適。你有什麼想法 – aliusman

+0

創建一個額外的服務層。 – Jaber

+0

這是不是很好的做法實施在Constroller行動 – Jaber