【问题标题】:Force .NET MVC Controller to Call Service Methods Rather Than Directly Calling Base Class强制 .NET MVC 控制器调用服务方法而不是直接调用基类
【发布时间】:2015-08-29 14:55:28
【问题描述】:

我在使用 Entity Framework 6 的 .NET MVC5 中有一个标准类堆栈:

MyController()
MyService() : ServiceBase()
ServiceBase() : IServiceBase

目前所有方法/类都是公开的。

ServiceBase() 包含泛型(T) 方法并被所有服务继承。

问题是MyController()可以直接调用ServiceBase()中的泛型方法。在传递给ServiceBase()之前,需要在实体上设置重要属性。

有没有办法从MyController() 中隐藏ServiceBase() 方法,强制MyController() 通过MyService() 而不是直接调用ServiceBase() 方法?

谢谢大家。

【问题讨论】:

  • 你有什么理由不能让这些方法protected
  • 当我使它们受到保护时,我收到一条错误消息,指出非公共方法 UpdateEntity() 无法实现接口 IServiceBase 中的方法。并且接口定义上没有设置访问器。
  • 贴出三个类的代码

标签: asp.net-mvc inheritance controller base-class service-layer


【解决方案1】:

为什么要从界面开始?我认为你让你的 OO 有点困惑。我认为您遇到的问题是您从一个没有方法可见性控件的界面开始。因此,您尝试将其隐藏在 ServiceBase 中,但 MyService 必须了解接口,这就是为什么您不能在中途更改可见性的原因。

我建议你重新考虑一下你的 OO 策略。

但是,如果你真的想保留接口并隐藏基类中的方法,你可以在 MyService 中将它们清空,而在 MyService 的另一个方法中,你可以直接调用基类。我创建了一个示例here

但就像我说的,我会阻止这种行为并提出更好的 OO 策略。如果您可以在一个单独的问题中发布您的代码,那么我和社区的其他人可以帮助您解决这个问题。仅供参考,这在codereview stackexchange 网站上可能会更好。

【讨论】:

    【解决方案2】:

    答案是让我不希望控制器直接访问的基类抽象化,同时继续包含方法实现。

    使用受保护的构造函数使 ServiceBase 类抽象。然后只有从它们派生的类才能直接访问它们的方法,从而迫使控制器调用控制器服务,然后控制器服务调用基础服务类。

    I wrote all this up in a blog post here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-21
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      相关资源
      最近更新 更多