我一直在嘗試在asp.net MVC5應用程序中實現鬆散耦合的應用程序。我有一個控制器:如何在C#中防止構造函數被濫用class
public class HeaderController : Controller
{
private IMenuService _menuService;
public HeaderController(IMenuService menuService)
{
this._menuService = menuService;
}
//
// GET: /Header/
public ActionResult Index()
{
return View();
}
public ActionResult GetMenu()
{
MenuItem menu = this._menuService.GetMenu();
return View("Menu", menu);
}
}
,服務於該控制器使用的是:
public class MenuService : IMenuService
{
private IMenuRespository _menuRepository;
public MenuService(IMenuRespository menuRepository)
{
this._menuRepository = menuRepository;
}
public MenuItem GetMenu()
{
return this._menuRepository.GetMenu();
}
}
和存儲庫在服務類中使用的是:用於
public class MenuRepository : IMenuRespository
{
public MenuItem GetMenu()
{
//return the menu items
}
}
的接口該服務和存儲庫是這樣的:
public interface IMenuService
{
MenuItem GetMenu();
}
public interface IMenuRespository
{
MenuItem GetMenu();
}
HeaderController
的構造函數使用構造函數注入獲取MenuService
,並且我已將ninject作爲處理此操作的DI容器。
這一切的偉大工程 - 除了在我的控制,我仍然可以做到這一點:
MenuItem menu = new MenuService(new MenuRepository());
...它打破了架構。我怎樣才能防止以這種方式使用'新'?
乾脆不要做那?不知道爲什麼這會比命名控制器'HeaderCantroller'更麻煩「,這會破壞體系結構」...是否有特別的理由讓你尋找它(比如特殊的模式不能通過良好的命名/代碼審查來停止)? –
你不能驗證構造函數內的參數,並且如果使用不正確的話會拋出異常? –
@AlexeiLevenkov:使用構造函數直接違反了「關注點分離」,並將HeaderController緊密地耦合到MenuService和MenuRepository。 –