如何防止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解决方案:

WebApp项目(控制器等)->服务接口项目

服务Impl项目->服务接口项目

即使这是一个很好的方法,也不是绝对可靠的方法-另一个组成部分是教育和代码审查,以提出对团队有用的最佳实践,例如可测试性和依赖注入。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在访问C#中的成员函数时防止调用一个类的构造函数?

C#如何在字典中存储类构造函数

C#如何使类的构造函数

C#中的类构造函数

如何防止AutoFixture的GuardClauseAssertion检查继承的类中的构造函数?

在c#中如何防止类被修改

如何防止构造函数在C ++中强制转换参数类型?

C#如何使用存储在构造函数变量中的类名创建新对象?

如何在C#中调用通过Structure Map实例化的类的构造函数

c#如何在数组类构造函数中存储多个值?

如何在Lua中注册C#类构造函数

C#在构造函数中传递对类的引用

非抽象C#类中的无主体构造函数

继承类C#中的空构造函数

C#测试-构造函数调用中的模拟类

C#中的构造函数

如何在C ++中的类构造函数中使用线程?

C#静态类构造函数

防止从Java类中调用私有构造函数

如何让子类中的构造函数继承构造函数或基类?

C#如何只向父类的成员公开嵌套类的构造函数?

当父类在 C++ 中没有默认构造函数时,如何在继承的类中使用构造函数?

在C ++类的构造函数中引发异常

类构造函数C ++中的条件

我可以从 C# 中另一个类的构造函数调用构造函数吗?

在C#中的抽象类中,私有构造函数有什么用?

就像在C#类构造函数中一样,在C结构中设置变量

如何使用基类的数据成员作为派生类的构造函数?(在 C++ 中)

如何在C ++中从基类构造函数调用派生类方法?