2015-10-16 74 views
0

我有兩個類 - 在這種特殊情況下MVC - 控制 - 有一個共同的控制器行動(將從JavaScript調用JSON行動)。由於代碼重複,我想將此操作放在父控制器類中。我們已經有了一個控制器基類,它繼承自Controller並用作6個其他控制器的基本類,具有通用功能。我的JSON操作實際上僅適用於2個控制器,所以我認爲將JSON操作放入其他6個控制器已使用的基本控制器中並不是一個好主意。下面是現有的類層次結構圖:我應該如何封裝我的MVC-Action以避免代碼重複?

Existing Controller class hierarchy

我應該在哪裏把我的JSON的行動,以避免代碼重複?我的想法是繼承ControllerBase類 - 讓我們說ControllerBaseExtended - 並把我的JSON動作放在這裏。所以現在,我的2個控制器可以繼承ControllerBaseExtended而不是ControllerBase。這是類層次結構會是什麼樣子底:

Final Controller class hierarchy

有沒有更好的辦法來解決這個問題呢?

回答

0

不是創建另一個基本控制器,而是將來自兩個操作的代碼提取到另一個類中,例如, JsonActionProcessor。然後你需要調用這個實現。

public class JsonActionHelper 
{ 
    public JsonResult Something() 
    { 
     //do something common 
     return new JsonResult(); 
    } 
} 

然後你可以從你的行動

public JsonResult Action1() 
{ 
    return new JsonActionHelper().Something(); 
} 

public JsonResult Action2() 
{ 
    return new JsonActionHelper().Something(); 
} 

如果你有單元測試,那麼你應該從JsonActionHelper提取接口,並將其注入到您的控制器調用它。

但是,如果您有兩個相同的操作,爲什麼不只有一個操作,並通過JavaScript從不同的視圖調用它?

+0

我想我會嘗試使用這個組合解決方案,而不是繼承。這兩個控件的操作是相同的,但操作的結果來自Service對象。此服務對象是特定於控制器的。所以我認爲現在問題轉到服務/存儲庫層。 –

0

將所有控制器更改爲繼承BaseController而不是Controller。

這聽起來像你已經這樣做了 ....但由於某種原因它的不好,你能解釋,爲什麼這是不是爲你工作好一點......

public class [my]Controller : BaseController 
{ 
    public ResualtAction [my]Action 
     return Base.Something(); 
    } 
} 

public class BaseController : Controller 
{ 
    public CustomeReturnAction Something() 
    { 
     return new CustomeReturnAction(); 
    } 
} 

還是你只是想組織它更好......

如果是這樣的話,只是將所有的返回動作類型移動到另一個類,並讓你的BaseController繼承,我認爲你說,已經,如果你是那麼好的話。

+0

我只是想更好地組織我的源代碼,並瞭解其他人如何解決這個問題。我以某種方式不想繼承自定義的基本控制器,但我不知道如何以另一種方式解決問題。 –

0

它取決於重複代碼的功能。您可以使用任何繼承或組合(使用注入類)來重用不同控制器中的代碼。

例如:我們有一個計算類用於計算產品的價格,並使用Dependancy Injection將此邏輯注入到不同的控制器中。控制器然後使用這個計算器來呈現輸出。

也許看看ASP.Net MVC的依賴注入。我建議Simple Injector。它很好地集成到ASP.Net MVC框架中。