【发布时间】:2015-04-21 02:49:42
【问题描述】:
我一直在尝试在 asp.net MVC5 应用程序中实现松散耦合的应用程序。我有一个控制器:
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 紧密耦合。
-
@RonBeyer:我该怎么做?我的意思是,如果我实例化“新”类,它仍然是正确的,因为构造函数正在获取正确的对象类型。我想防止程序员直接调用它,因为它会紧密耦合它们。
标签: c# asp.net asp.net-mvc dependency-injection inversion-of-control