如何防止构造函数在c#类中的滥用

我一直试图在一个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 Solution:

WebApp Proj (Controllers etc.) –> Service Interface Proj

Service Impl Project –> Service Interface Proj

即使这样,这是一个很好的方法,它并不是傻瓜的证明 – 另一个组件是教育和代码审查,以提出为您的团队工作的最佳做​​法,如可测试性和依赖注入.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...