.net Web服务最佳实践...... SRP?

时间:2009-07-06 16:37:37

标签: c# wcf web-services

.asmx或wcf服务类对于多少文件,代码行,职责等的适当开发是什么?大多数人为每个班级的不同crud方法发布单独的.asmx服务文件吗?

3 个答案:

答案 0 :(得分:5)

一般来说,服务应该封装一组常用操作。无论您是使用ASMX还是WCF,都不应为每个操作创建一个“服务”。面向服务的体系结构(SOA)背后的一般思想是模拟现实世界的业务行为。为了给你一个愚蠢的,但希望有效的例子......想想餐馆里的女服务员。女服务员以订单,服务这些订单,提供饮料补充,提供调味品,最后处理付款的形式向客户提供服务。女服务员提供的服务不是单一操作,而是相关操作的聚合。

然而,它并不止于此。 SOA的真正本质是任何给定的服务都可能依赖于其他服务。女服务员不依靠厨师的服务,提供膳食,服务柜台的人,可以获得调味品和饮料的情况,以及餐馆大楼本身提供的服务,都无法完成工作。女服务员提供的服务类型与厨师提供的服务之间也存在一些根本区别。将其归结为技术编​​程术语......女服务员是一项任务服务,但库克是一种实体(或CRUD)服务。女服务员处理更高级别的操作,为客户提供有用的功能,而厨师处理较低级别的操作,只为餐厅的其他员工提供细粒度和复杂的功能。

我不能真正给你一个特定的答案,除了说你只是整理你的服务,但它们在逻辑上合适。对每个服务进行一次操作可能不是一个好习惯......然而,服务只进行一次操作并不是闻所未闻。任务服务通常只有一个操作。实体服务通常有许多操作,通常是基于CRUD的,但有时还有其他服务。还有公用事业服务提供最低级别的基础设施运营(回到餐厅,公用事业服务就像炉子,烤架,登记册等)。如果您在实际业务概念之后对服务进行建模,那么他们公开的操作和他们的彼此之间的依赖最终应该变得清晰。

有关SOA的一些重要信息,请查看Thomas Erl(Prentice Hall)的SOA系列,因为它们是实现面向服务的企业的权威资源。

答案 1 :(得分:4)

首先,新开发的最佳实践是使用WCF。请参阅Microsoft: ASMX Web Services are a “Legacy Technology”

其次,在SOA中,人们尝试使用粗粒度操作来创建服务。例如,您需要OrderProduct操作,而不是StartOrder,AddLineItem,AddOption,FinishOrder操作。 OrderProduct操作可以接受OrderDTO,如下所示:

public class OrderDTO {
    public CustomerInfo Customer {get;set;}
    public DateTime OrderTime {get;set}
    public DateTime ShipTime {get;set;}
    public List<LineItemDTO> LineItems {get; private set;}
}

public class LineItemDTO {
    public int LineItemNumber {get;set;}
    public string ProductName {get;set;}
    public int Quantity {get;set}
    public Decimal Amount {get;set}
    public Decimal ExtendedAmount {get;set;}
}

而不是只创建一个空订单的StartOrder方法,然后是AddLineItem调用来添加单个行项目(就像你可能从桌面应用程序那样做),我推荐一个接受OrderDTO的OrderProduct方法,有一个LineItemDTO的集合。您将一次性发送整个订单,在交易中添加所有部分,然后完成。

最后,我要说你还应该分为业务层和数据层。服务层应该只关注事物的服务方面,并且会调用业务逻辑层以完成任务。

答案 2 :(得分:2)

随时随地抓取这本书:

Service Oriented Architecture (SOA): Concepts, Technology, and Design

回答您的每个问题以及您在实施过程中遇到的更多问题。