WF4.0实战(十):分布式酒店订房系统

简介:

    这篇文章主要是实现一个分布式的酒店订房功能。主要阐述如何通过WCF加WF实现一个分布式系统模型。

    这个Demo的场景说明:

    一家酒店将房间信息存储在SQL Server数据库中,酒店的工作人员根据客户的要求的房间类型,查询出房间的价格,告诉用户价格,决定是否订房。

    分布式订房系统系统设计图:

    

上图说明:

1、通过ADO.NET Data Serivce访问数据库,它使用ADO.NET Entity DataModel和WCF Data Service构建一个数据库增删查改的WCF服务。

2、WF4.0 Service是WF4.0的WCF服务,通过WCF访问ADO.NET Data Serivce。

3、WF4.0 Client和.NET Windows client是两个客户端,他们的功能是相同的,通过Internet访问WF4.0 Service。

传统的分布式设计图:

比较一下两张图片,你会发现:

1、传统的数据库访问是使用SQL Helper。

2、将业务逻辑宿主在Web Service中,现在是宿主在WF4.0和WCF结合的服务中。

实现:下面我将一步一步实现这个Demo

1、创建数据库,就一张表如下图:

2、创建ADO.NET Data Service:

新建一个RentRoom空项目,添加一个ASP.Net应用程序RentRoomDataService,删除所有的aspx和cs文件。添加一个ADO.NET Entity DataModel项目,将其命名为myModel.edmx。如下图:

选择Generates from database,点下一步,新建一个连接字符串,如下图:

点击OK,点击next,选择表Room,点击完成,如下图:

在RentRoomDataService中添加一个WCF Data Service,命名为MyWcfDataService.svc,如下图:

修改MyWcfDataService.svc.cs代码:

复制代码
1       public   class  MyWcfDataService : DataService < RentRoomEntities2 >
2      {
3           //  This method is called only once to initialize service-wide policies.
4           public   static   void  InitializeService(DataServiceConfiguration config)
5          {
6                config.SetEntitySetAccessRule( " * " , EntitySetRights.All);
7                config.SetServiceOperationAccessRule( " * " , ServiceOperationRights.All);
8          }
9      }
复制代码

这样ADO.NET Data Service创建完成。

3、创建RentRoomCustomActivities,它包括三个自定义活动:

先添加MyWcfDataService服务引用,如下图:

GetInput用于接收等待用户输入,代码如下:

复制代码
 1       public   class  GetInput : CodeActivity
 2      {
 3          OutArgument < string >  data; 
 4           public  OutArgument < string >  Data 
 5          {
 6               get  {  return  data; }
 7               set  { data  =  value; } 
 8          }
 9 
10           protected   override   void  Execute(CodeActivityContext context)
11          {
12               string  input  =  Console.ReadLine();
13              context.SetValue(data, input);
14          }
15      }
复制代码

CheckPrice用于查询房间的价格,调用ADO.NET Data Service,代码如下:

复制代码
 1       public   class  CheckPrice : CodeActivity
 2      {
 3          InArgument < string >  roomID;
 4           public  InArgument < string >  RoomID
 5          {
 6               get  {  return  roomID; }
 7               set  { roomID  =  value; }
 8          }
 9 
10          OutArgument < decimal >  roomPrice;
11           public  OutArgument < decimal >  RoomPrice
12          {
13               get  {  return  roomPrice; }
14               set  { roomPrice  =  value; }
15          }
16 
17           protected   override   void  Execute(CodeActivityContext context)
18          {
19               string  carId  =  RoomID.Get(context);
20 
21              String urlstr  =   " http://localhost:40438/MyWcfDataService.svc " ;
22              CarRentalReference.RentRoomEntities2 proxy  =   new  CarRentalReference.RentRoomEntities2( new  Uri(urlstr));
23 
24              var query  =  (from c  in  proxy.Room
25                            where  c.RoomID  ==  carId
26                           select c).First();
27 
28               decimal ?  price  =  query.RoomPrice;
29 
30              context.SetValue(RoomPrice, price);
31          }
32 
33 
34      }
复制代码

BookRoom用于确定订房,调用ADO.NET Data Service,代码如下:

复制代码
 1      public   class  BookRoom : CodeActivity
 2      {
 3          InArgument < string >  roomId;
 4           public  InArgument < string >  RoomId
 5          {
 6               get  {  return  roomId; }
 7               set  { roomId  =  value; }
 8          }
 9 
10           protected   override   void  Execute(CodeActivityContext context)
11          {
12               string  carId  =  RoomId.Get(context);
13 
14              String urlstr  =   " http://localhost:40438/MyWcfDataService.svc " ;
15              CarRentalReference.RentRoomEntities2 proxy  =   new  CarRentalReference.RentRoomEntities2( new  Uri(urlstr));
16 
17              var query  =  (from c  in  proxy.Room
18                            where  c.RoomID  ==  carId
19                           select c);
20 
21               foreach  (CarRentalReference.Room room  in  query)
22              {
23                  room.Quantity  =  room.Quantity  -   1 ;
24                  proxy.UpdateObject(room);
25                  proxy.SaveChanges();
26                   break ;
27              }
28              
29          }
30 
31 
32      }
复制代码

RentRoomCustomActivities创建完成。

4、创建RentRoomWFService。这是设计图上的WF4.0 Service。

    这个服务由两个ReceiveAndSendReply构成,第一个ReceiveAndSendReply,如下图:

第二个ReceiveAndSendReply,如下图:

ReceiveAndSendReply具体的设置参考:WF4.0实战(三):WCF服务 、WF4.0 基础篇 (二十七) WCF Workflow Service 在WCF中使用WF

在Program.cs中写启动这个服务的代码,如下:

复制代码
 1           static   void  Main( string [] args)
 2          {
 3               string  baseAddress  =   " http://localhost:8090/RentRoomService " ;
 4 
 5 
 6 
 7               using  (WorkflowServiceHost host  =
 8                 new  WorkflowServiceHost( new  Workflow1(),  new  Uri(baseAddress)))
 9              {
10                  host.Description.Behaviors.Add( new
11                    ServiceMetadataBehavior() { HttpGetEnabled  =   true  });
12                  host.AddDefaultEndpoints();
13 
14                  host.Open();
15                  Console.WriteLine( " Rent Room service listening at:  "   +
16                                    baseAddress);
17                  Console.WriteLine( " Press ENTER to exit " );
18                  Console.ReadLine();
19                  host.Close();
20              }
21          }
22      }
复制代码

这样RentRoomWFService完成。

5、客户端RentRoomWidowsClient

启动RentRoomWFService,在RentRoomWidowsClient添加RentRoomWFService引用,如下图:

使用下面代码模拟订房:

1              ServiceReference1.RentRoomDataContract contract  =   new  ServiceReference1.RentRoomDataContract();
2              contract.RoomId  =   " gaoji " ;
3              contract.CustomerId  =   " 012 " ;
4              ServiceReference1.ServiceClient proxy  =   new  ServiceReference1.ServiceClient();
5               decimal ?  test  =  proxy.CheckPrice(contract);
6               bool ?  test1  =  proxy.BookRoom( " 012 " );

6、客户端RentRoomWFClient

定义一个工作流调用WF服务,详见RentRoomWFClient.Workflow1.xaml。

启动RentRoomWFService服务,如下图:

运行效果图:



本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2010/04/27/DistributedApps.html,如需转载请自行联系原作者


相关文章
|
2月前
|
消息中间件 RocketMQ 微服务
RocketMQ 分布式事务消息实战指南
RocketMQ 分布式事务消息实战指南
255 1
|
2月前
|
Java 数据库连接 API
分布式事物【XA强一致性分布式事务实战、Seata提供XA模式实现分布式事务】(五)-全面详解(学习总结---从入门到深化)
分布式事物【XA强一致性分布式事务实战、Seata提供XA模式实现分布式事务】(五)-全面详解(学习总结---从入门到深化)
56 0
|
开发框架 Java 数据库连接
分布式事物【XA强一致性分布式事务实战、Seata提供XA模式实现分布式事务】(五)-全面详解(学习总结---从入门到深化)(下)
分布式事物【XA强一致性分布式事务实战、Seata提供XA模式实现分布式事务】(五)-全面详解(学习总结---从入门到深化)
37 0
|
数据库 微服务
分布式事物【XA强一致性分布式事务实战、Seata提供XA模式实现分布式事务】(五)-全面详解(学习总结---从入门到深化)(上)
分布式事物【XA强一致性分布式事务实战、Seata提供XA模式实现分布式事务】(五)-全面详解(学习总结---从入门到深化)
41 0
|
4天前
|
分布式计算 Ubuntu 调度
如何本地搭建开源分布式任务调度系统DolphinScheduler并远程访问
如何本地搭建开源分布式任务调度系统DolphinScheduler并远程访问
|
25天前
|
缓存 应用服务中间件 数据库
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
28 1
|
1月前
|
存储 分布式计算 大数据
现代化数据库技术——面向大数据的分布式存储系统
传统的关系型数据库在面对大规模数据处理时遇到了诸多挑战,而面向大数据的分布式存储系统应运而生。本文将深入探讨现代化数据库技术中的分布式存储系统,包括其优势、工作原理以及在大数据领域的应用。
|
1月前
|
消息中间件 存储 NoSQL
【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统
【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统
|
1月前
|
存储 Web App开发 运维
原来10张图就可以搞懂分布式链路追踪系统原理
原来10张图就可以搞懂分布式链路追踪系统原理
|
1月前
|
算法 Java 数据中心
分布式ID生成系统之雪花算法详解
在当今的云计算和微服务架构盛行的时代,分布式系统已成为软件开发的重要组成部分。随着系统规模的扩大和业务的复杂化,对数据一致性和唯一性的要求也越来越高,尤其是在全局唯一标识符(ID)的生成上。因此,分布式ID生成系统应运而生,成为保证数据唯一性和提高系统可扩展性的关键技术之一。雪花算法(Snowflake)是Twitter开源的一种算法,用于生成64位的全局唯一ID,非常适用于分布式系统中生成唯一标识符。下面我们将深入探讨雪花算法的原理、结构和实现方式。
97 2
 分布式ID生成系统之雪花算法详解

热门文章

最新文章