强制.NET MVC控制器调用服务方法而不是直接调用基类

时间:2015-08-29 14:55:29

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

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

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

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

ServiceBase()包含通用(T)方法,并由所有服务继承。

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

有没有办法隐藏ServiceBase()方法MyController()迫使MyController()通过MyService()而不是直接调用ServiceBase()方法?

谢谢大家。

2 个答案:

答案 0 :(得分:1)

为什么要从界面开始?我觉得你的OO有点困惑。我认为你遇到的问题是你从界面开始,它没有方法可见性控制。因此,您尝试在ServiceBase中隐藏它,但MyService必须知道接口,这就是为什么您无法在中途更改可见性。

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

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

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

答案 1 :(得分:0)

答案是使我不希望控制器直接访问的基类继续包含方法实现。

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

I wrote all this up in a blog post here