当前位置 : 主页 > 大数据 > 区块链 >

设计WCF数据合同和操作

来源:互联网 收集:自由互联 发布时间:2021-06-22
我开始设计一个现在很小的wcf服务总线,但随着我们的业务增长而增长,所以我担心一些问题并且也不会过多地试图YAGNI.这是一个电子商务平台.问题是我对于把东西放在哪里有太多的想法
我开始设计一个现在很小的wcf服务总线,但随着我们的业务增长而增长,所以我担心一些问题并且也不会过多地试图YAGNI.这是一个电子商务平台.问题是我对于把东西放在哪里有太多的想法.我将给出一个场景来展示我的所有问题.

We have an e-commerce website that sells products and ultimately deliveries them. For this we have a PlaceOrder service which, among other parameters, expects an Address object that in this context (our website placing an order) is made of City, Street and ZipCode.

We also do business with partners that use our platform only to sell products. They take care of the delivery. For this scenario we have a PlaceOrderForPartner service that, among other objects, expects an Address object. However, in this context (partner placing an order) the Address object is made of different information that is relevant only to a order placed by partner.

鉴于这种情况,我有几个问题:

1)如何在我的解决方案中的命名空间和文件夹中组织此DataContracts对象?我考虑过为每个上下文(合作伙伴,客户等)提供一个文件夹来保存服务和DataContracts.

所以我会的

- MySolution.sln
-    Partner (folder)
-        PartnetService.svc
-    DataContracts (folder)
-        Address
-    Customer (folder)
-        Customer.svc
-    DataContracts (folder)
-        Address

使用这种方式,我将有一个命名空间来放置我所有特定于上下文的数据交换.

2)服务设计怎么样?我应该为可能放置的每个人创建一个服务,并在其中订购和创建一个PlaceOrder方法,如下所示:

Partner.svc / PlaceOrder
Customer.svc / PlaceOrder

或使用PlaceOrderForPartner和PlaceInternalOrder创建订单服务,如下所示:

Order.svc / PlaceOrderForPartner
Order.svc / PlaceOrderForCustomer

3)假设我在上一个问题中选择了第一个选项,我应该如何处理订单上的操作以及合作伙伴和客户的共同操作?

4)我应该将DataContracts和Service定义放在同一个程序集中吗?每个一个?一切都与服务实施?

5)如何为操作命名输入和输出消息?我应该使用实体本身还是使用OperationNameRequest和OperationNameResponse模板?

最重要的是,我的问题是:如何“组织”服务创建中涉及的数据交换和服务?

提前感谢您对此的任何想法!

除了TomTom提到的,我还想在这里加2美分:

我喜欢这样构建我的WCF解决方案:

合同(类库)
包含所有服务,操作,故障和数据协定.可以在纯.NET到.NET方案中在服务器和客户端之间共享

服务实现(类库)
包含实现服务的代码,以及实现此目的所需的任何支持/帮助程序方法.没有其他的.

服务主机(可选 – 可以是Winforms,Console App,NT Service)
包含用于调试/测试的服务主机,或者也可能包含用于生产的服务主机.

这基本上给了我服务器端的东西.

在客户端:

客户端代理(类库)
我喜欢将我的客户端代理打包到一个单独的类库中,以便它们可以被多个实际的客户端应用程序重用.这可以使用svcutil或“添加服务引用”并手动调整生成的可怕的app.config,或者通过使用ClientBase< T>进行客户端代理的手动实现(当共享契约程序集时)来完成.或ChannelFactory< T>结构体.

1-n个实际客户(任何类型的应用程序)
通常只会引用客户端代理程序集,或者也可能引用契约程序集(如果它正在共享).这可以是ASP.NET,WPF,Winforms,控制台应用程序,其他服务 – 您可以命名.

那样;我有一个漂亮而干净的布局,我一遍又一遍地使用它,我真的认为这使我的代码更清洁,更容易维护.

这是受到Miguel Castro在DotNet Rocks电视上的Extreme WCF screen cast与Carl Franklin的启发 – 强烈推荐的屏幕演员!

网友评论