.net 避免web服务类

.net 避免web服务类,.net,wcf,soap,refactoring,.net,Wcf,Soap,Refactoring,我有一个复杂的RIA客户机,它与WCFSOAPWeb服务通信,第二个a是关键。这导致了一个可怕的god类,迄今为止包含131个[OperationContract]方法,甚至更多的私有方法 就我个人而言,我对此没有问题;我使用VisualStudio的搜索和导航功能很容易在课堂上找到自己的方向。然而,其他开发者也因此而受苦。他们是那种慢慢滚动寻找东西的人(看着很烦人)。我把全班分成了几个部分,但我是唯一一个似乎享受到这一好处的人(他们属于似乎更为普遍的地区仇恨阵营) 所以,为了善待其他程序员,并

我有一个复杂的RIA客户机,它与WCFSOAPWeb服务通信,第二个a是关键。这导致了一个可怕的god类,迄今为止包含131个[OperationContract]方法,甚至更多的私有方法

就我个人而言,我对此没有问题;我使用VisualStudio的搜索和导航功能很容易在课堂上找到自己的方向。然而,其他开发者也因此而受苦。他们是那种慢慢滚动寻找东西的人(看着很烦人)。我把全班分成了几个部分,但我是唯一一个似乎享受到这一好处的人(他们属于似乎更为普遍的地区仇恨阵营)

所以,为了善待其他程序员,并享受一些我不知道的好处,我想重构怪物。以下是我看到的可用选项:

选项1:将web服务分割为单独的服务 我不喜欢的是它会破坏我的客户端代码。我必须重写它才能使用新的代理类。此外,我还需要维护更多的WCF配置(糟糕!)。此外,对于共享私有方法的归属,可能会有监护权之争

选项2:使用分部类 这个想法似乎对我很有吸引力。使用这种方法,我要做的是让每个源文件(不是太多)表示web服务的一个功能分区。例如:

MyService.svc.cs
MyService.AccountManagement.svc.cs
MyService.Preferences.svc.cs
MyService.MediaManagement.svc.cs
我有点担心这种方法,因为在我提出这种可能性的前一家公司,一位开发人员说这是一个坏主意,因为一些模糊的“部分类存在问题”原因。我从未得到过比这更好的解释,但我相信了他的话

选项3:我没有考虑过的事情 我假设对于一个复杂的web服务来说,创建这样的god类并不少见,所以一定有一些我不知道的好的实践方法。你们都使用了哪些技术让你们的web服务类看起来更简单

更新 谢谢大家的意见。我希望我能接受不止一个答案


我已经阅读了您的答案,并与开发团队讨论了一些问题,现在,我们只是将服务重新组织为部分类。我将对其他建议发表评论,以解释为什么我不采用这些方法,至少现在是这样。你们都给了我一些有价值的东西来考虑未来的发展。

部分类选项听起来不错,因为它基本上为您提供了选项1的好处,同时保持了接口的兼容性。据我所知,分部类没有真正的问题,VS在所有设计器文件上都使用它们,如果存在问题,这也没有意义。

如果您可以将服务重构为单独的分部类文件,每个文件封装一定数量的相关功能,您还可以将服务重构为单独的类来封装此功能。您的服务将成为这些类及其功能的表面

有时这是不可行的,并且会使事情变得更加复杂,但是你是一个在这里打电话的人,因为你知道你的代码库。在这种情况下(在与分析师开发人员进行了一次很好的头脑风暴会议之后),部分类文件仍然是一个更好的选择

有一件事是肯定的。您的服务必须重构。(编辑:代码不仅用于执行,还用于维护。如果很难找到解决方法,它肯定是不可维护的。)

关于部分阶级问题。我不认为这是一个有价值的评论,直到它被一些真实的事实所支持,为什么它们是一个问题。 关于重构

将您的服务视为web应用程序用户界面。就像web应用程序使用BLL类一样,它们的封装功能与整个解决方案的单个问题/方面有关,您的web服务也应该如此。它应该是一个使用BLL类及其原子功能的接口。它不是可视化界面,而是API。

嘿,Jacob,不确定这是否能直接帮助您,但您提到了很多私有方法

这向我表明,您的Web服务提供两个角色,逻辑和接口…但实际上,它可能只提供一个,即逻辑中的接口

是否有可能将尽可能多的逻辑移到一个好的命名空间类库中,而只在服务本身中保留最简单的方法

更新:

关于为什么要重构和/或如何设计类库,中的一些原则可能对您有用。特别是:

  • 单一责任原则
  • 界面分离原理
检查上面的链接,它将总结所有的原则


上面有一些。如果有人对这些有更好的链接,请让我知道,干杯

重新考虑建议:

您不必在一个服务合同中包含131个运营合同。将其分解为每个功能区域的一份服务合同。您的服务最终会有多个端点,但这真的很重要吗

将所有服务契约和数据契约放入“仅契约”程序集中。将实现类放入不同的程序集(或按函数分解的多个程序集)。将web服务facade放入另一个程序集中,其中只包含一个
web.config
文件和大量指向实现类的空
.svc
文件

重新分解的
.svc
文件示例,没有代码隐藏(因为“代码隐藏”位于不同的程序集中):


以这种方式拆分代码的额外好处是,您的客户端应用程序没有
<%@ ServiceHost Service="Fully.Qualified.Name.Of.Implementation.Class" %>