2010-03-22 250 views
4

問候 在我的所有控制器我回收一個包裝我的模型和訪問服務層相同的代碼 - 我累複製/粘貼到每個控制器:MVC模型狀態

private IProjectService _service; 
public New() 
{ 
_service = new ProjectService(new ModelValidation(this.ModelState)); 
} 
public New(IProjectService service) 
{ 
_service = service; 
} 

有沒有什麼地方可以將我的所有控制器都存放在哪裏?

回答

5

你可以把在基控制器類,你的所有其他控制器繼承:

public class BaseController : Controller 
{ 
    protected IProjectService Service { get; private set; } 
    public New() 
    { 
     Service = new ProjectService(new ModelValidation(this.ModelState)); 
    } 
    public New(IProjectService service) 
    { 
     Service = service; 
    } 
} 

或者,您也可以在dependency injection念起來看看使用IoC容器注入這些依賴。

+0

+1提到DI,我會添加做IProjectService的構造函數注入,因爲控制器類取決於服務&不能執行沒有服務的有效實例 – Sunny 2010-03-22 15:23:53

+0

@Sunny - 對此的不同學派。我理解使用構造函數注入來獲得必要的依賴關係的論據,但是也有一個論點是使用一致的注入方法,當然並不是所有的IOC容器都像其他方法一樣容易地支持所有的方法。但是,這是OP在希望閱讀這個主題時能夠拿起的那種東西。 – 2010-03-22 15:53:52

1

控制器基類?

1

創建一個基礎控制器,並從中派生您的控制器。

public class BaseController : Controller 
{ 
     protected IProjectService _service; 
     public New() 
     { 
      _service = new ProjectService(new ModelValidation(this.ModelState)); 
     } 
     public New(IProjectService service) 
     { 
      _service = service; 
     } 
} 
public class MyController : BaseController 
{ 
    public ActionResult Index() 
    { 
    } 
} 
2

歡迎來到美好的世界code smells。你甚至不知道它是什麼。每當你想到自己。 「一定有更好的方法。」有。在這種情況下,基類對解決您的問題將會有很長的路要走。

+1

是的,無論何時您複製/粘貼大量代碼,通常都有更好的方法! :) – mlsteeves 2010-03-22 15:10:45