C# SOA服务的分离

C# SOA服务的分离,c#,web-services,architecture,layout,soa,C#,Web Services,Architecture,Layout,Soa,我想写一些网络服务 什么定义了一个“服务”单元。我注意到,作为一个项目的一部分,您可以有多个.svc服务文件 您通常如何细分您的服务?例如,银行应用程序: 您需要一个服务(.svc)吗 客户 AddClient(Client newClient) 删除客户端(客户端) 帐目 集合名(字符串名) SetType(AccountType类型) 转移 SendMoney(客户等) 收款(客户等) 住房贷款 AddNewHomeLoan() 取消住房贷款 是否有对实体进行分组的方法?

我想写一些网络服务

什么定义了一个“服务”单元。我注意到,作为一个项目的一部分,您可以有多个.svc服务文件

您通常如何细分您的服务?例如,银行应用程序:

您需要一个服务(.svc)吗

  • 客户
    • AddClient(Client newClient)
    • 删除客户端(客户端)
  • 帐目
    • 集合名(字符串名)
    • SetType(AccountType类型)
  • 转移
    • SendMoney(客户等)
    • 收款(客户等)
  • 住房贷款
    • AddNewHomeLoan()
    • 取消住房贷款
是否有对实体进行分组的方法?例如,您可以将“发送”和“接收”资金放在“帐户服务”中,而不是使用转账服务,因为您从帐户接收和发送资金

这也带来了关于方法和参数的另一个问题。如果我想添加一个编辑客户机,通常会添加像EditClient(客户机客户机,客户机newClient)这样的方法,并用另一个客户机对象替换整个客户机吗?或者您会在客户机服务下添加单独的方法来编辑客户机,例如:EditName(客户机,字符串名称)


我想在我的web服务中适当地安排运营合同。

我建议阅读。这应该为面向服务的软件提供很多组织策略。

我更喜欢按功能而不是结构来划分我的服务。Eric Evans对此技术进行了深入讨论。这背后的驱动因素之一是变化率。功能领域往往以类似的速度变化

结构(不良):

  • 客户
  • 帐目
  • 贷款
功能性(良好):

  • 账单
  • 供应
  • LoanApproval

在设计Web服务时,我喜欢遵循一些粗略的规则,特别是对于公开的(服务可能由某些已定义组之外的应用程序/用户使用)服务

  • 最大工作单元:Webservices(实际上是任何RPC服务)是另一个在单独(通常)机器上运行的软件,即使在同一台机器上调用它(与本地函数调用不同),也会产生费用。请记住这一点,并构建可能接受尽可能多数据的函数。不要依靠服务器之间的往返来沟通和完成业务操作单元。例如,不要有一个“创建帐户”的过程,该过程需要调用“添加用户”、“创建帐户”、“将用户与帐户关联”、“更新用户详细信息”、“激活帐户”来完成该过程。取而代之的是一个“createUserWithAccount”函数,它可以一次性完成
  • 最小等待时间:请记住,这些服务称为内联服务,如果您的进程需要很长时间,则该进程可能会被不耐烦的用户、介于两者之间的服务或看门狗进程(假设出现错误)终止。您可能会考虑优先选择返回“票”的服务,然后调用方可以稍后进行检查。在大多数情况下,这并不是绝对必要的,但对于可能需要一分钟以上运行的进程,您可能需要这种方法
  • 定义良好的接口:确保您的服务具有定义良好的接口,最好是类型无关的接口。类型不可知在这里定义为确保您使用易于通信的公共类型,并且对客户端实现者产生意外副作用的可能性很小。许多人喜欢使用XML作为消息传输的基础,并将其所有细节隐藏在其中
  • 变更计划:服务存在很长一段时间(通过设计),同时暴露给外部实现者。这意味着它们需要更改,但客户要求可能会妨碍您轻松地进行更改。在构建接口时,要么考虑版本控制,要么使用传输编码(如XML),这样就可以在不修改调用接口的情况下修改发送的数据。看看API(比如windowsapi)是如何处理这个问题的,从而了解它是如何产生问题的
  • 安全性作为一级设计目标:任何人都可以调用服务接口。您必须预料到它们将被各种各样的用户调用,这些用户可能已经或可能没有经过身份验证,可能本质上是恶意的,也可能不是恶意的。计划在适当的地方进行安全保护,不要只依靠一种机制来验证一切是否安全。有几种方法可用于安全性,如果您的服务在内部使用,您可以放松一些事情,但对于公共服务,您将需要考虑如何安全工作,并确保它在所有服务中保持一致。 希望有帮助

    • 这些是福勒和其他人的一般策略。只是我对如何处理它的看法
    除了GrayWizardx的出色回答之外,我还要补充一点

    尝试将所有服务定义保持在功能/业务级别。服务名称应具有良好的高级“ChangeDeliveryAddress”、“QueryOrderStatus”类型名称,接口定义本身应仅包含业务实体和最少数量的“技术”字段。i、 e.接口与实现的完全分离


    如果您发现自己使用了“NextOrderLineWithinPage”之类的服务,那么您的设计可能出了问题

    福勒是个黑客,我会像躲避瘟疫一样躲避他。我强烈反对。我从来没听过有人这么说福勒。要详细说明吗?GrayWizardx显然已经开发了工作服务!我要补充的唯一一点是尽量保持对business用户有意义的界面。例如“CreateCustomer”而不是“InsertCnumToAccTable”。感谢您提供非常详细的回答