避免网络服务神课程

Jac*_*cob 5 .net wcf refactoring soap

我有一个复杂的RIA客户端,它与WCF SOAP Web服务通信,第二是操作词.这导致了一个可怕的神类,到目前为止包含131 [OperationContract]方法,甚至还有更多的私有方法.

就个人而言,我对此没有任何问题; 我使用Visual Studio的搜索和导航功能很容易找到我在课堂上的方式.然而,其他开发商正因此受苦.他们是慢慢滚动寻找事物的种类(看起来很烦人).我把这个班级区分成几个部分,但我是唯一一个似乎享受这个好处的人(他们是看似更常见的#region-hating camp).

所以,为了对其他程序员很好,也许享受一些我不知道的好处,我想重构怪物.这是我看到的选项:

选项1:将Web服务分段为单独的服务

我不喜欢这个是它会打破我的客户端代码.我必须重写它以使用新的代理类.另外,我还需要维护更多的WCF配置(哎呀!).此外,可能存在共享私有方法应属于何处的监护权争夺战.

选项2:使用部分类

这个想法似乎对我很有吸引力.我用这种方法做的是让每个源文件(不是太多)代表Web服务的功能划分.例如:

MyService.svc.cs
MyService.AccountManagement.svc.cs
MyService.Preferences.svc.cs
MyService.MediaManagement.svc.cs
Run Code Online (Sandbox Code Playgroud)

我担心这种方法,因为在一家前公司,当我提出这种可能性时,一位开发人员说这是一个坏主意,因为一些模糊的"部分类有问题"的原因.我从来没有比这更好的解释,但我接受了他的话.

选项3:我没有考虑过的事情

我认为复杂的Web服务创建诸如此类的神类并不罕见,因此必须有一些我不知道的良好实践方法.您使用哪些技术使您的Web服务类更容易在眼睛上?

更新

谢谢各位的意见.我希望我能接受不止一个答案.

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

and*_*ndy 8

嘿雅各布,不确定这是否能直接帮助你,但你提到了很多私人方法.

这告诉我你的WebService正在服务于两个角色,逻辑和接口......但事实上,它应该只服务一个,即接口的逻辑.

是否有可能将尽可能多的逻辑移动到一个漂亮的命名空间类库中,只留下服务本身的最小方法?

更新:

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

  • 单一责任原则
  • 接口隔离原理

检查上面的链接,它将包含所有原则的摘要.

这里有一些关于它的SO讨论.如果有人有更好的链接,请告诉我,欢呼


Rob*_*nik 5

如果您可以将服务重构为单独的部分类文件,每个文件都封装了一定数量的相关功能,您也可以将服务重构为封装此功能的单独类.您的服务将成为这些课程及其功能的简单外观.

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

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

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

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