.net 避免web服务类
我有一个复杂的RIA客户机,它与WCFSOAPWeb服务通信,第二个a是关键。这导致了一个可怕的god类,迄今为止包含131个[OperationContract]方法,甚至更多的私有方法 就我个人而言,我对此没有问题;我使用VisualStudio的搜索和导航功能很容易在课堂上找到自己的方向。然而,其他开发者也因此而受苦。他们是那种慢慢滚动寻找东西的人(看着很烦人)。我把全班分成了几个部分,但我是唯一一个似乎享受到这一好处的人(他们属于似乎更为普遍的地区仇恨阵营) 所以,为了善待其他程序员,并享受一些我不知道的好处,我想重构怪物。以下是我看到的可用选项: 选项1:将web服务分割为单独的服务 我不喜欢的是它会破坏我的客户端代码。我必须重写它才能使用新的代理类。此外,我还需要维护更多的WCF配置(糟糕!)。此外,对于共享私有方法的归属,可能会有监护权之争 选项2:使用分部类 这个想法似乎对我很有吸引力。使用这种方法,我要做的是让每个源文件(不是太多)表示web服务的一个功能分区。例如:.net 避免web服务类,.net,wcf,soap,refactoring,.net,Wcf,Soap,Refactoring,我有一个复杂的RIA客户机,它与WCFSOAPWeb服务通信,第二个a是关键。这导致了一个可怕的god类,迄今为止包含131个[OperationContract]方法,甚至更多的私有方法 就我个人而言,我对此没有问题;我使用VisualStudio的搜索和导航功能很容易在课堂上找到自己的方向。然而,其他开发者也因此而受苦。他们是那种慢慢滚动寻找东西的人(看着很烦人)。我把全班分成了几个部分,但我是唯一一个似乎享受到这一好处的人(他们属于似乎更为普遍的地区仇恨阵营) 所以,为了善待其他程序员,并
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" %>