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
即使这样,这是一个很好的方法,它并不是傻瓜的证明 – 另一个组件是教育和代码审查,以提出为您的团队工作的最佳做法,如可测试性和依赖注入.
总结以上是内存溢出为你收集整理的如何防止构造函数在c#类中的滥用全部内容,希望文章能够帮你解决如何防止构造函数在c#类中的滥用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)