我一直在尝试在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());
...这破坏了架构。如何防止以这种方式使用“新”?
一切可以引用接口项目你-做这将是你的接口和实现进入单独的Visual Studio项目/组件和仅供参考实施项目中的工程项目实际需要的一种方式IMenuService
-在这一点上该代码可以占用该接口,但实际上无法真正实现任何实现。
然后,您可以在依赖项中的任何位置引用实现项目。
WebApp解决方案:
WebApp项目(控制器等)->服务接口项目
服务Impl项目->服务接口项目
即使这是一个很好的方法,也不是绝对可靠的方法-另一个组成部分是教育和代码审查,以提出对团队有用的最佳实践,例如可测试性和依赖注入。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句