设计WCF数据合同和操作

tuc*_*caz 4 service wcf soa

我开始设计一个现在很小的wcf服务总线,但随着我们的业务增长而增长,所以我担心一些问题,并且也没有尝试过太多YAGNI.这是一个电子商务平台.问题是我对于把东西放在哪里有太多的想法.我将给出一个场景来展示我的所有问题.

我们有一个电子商务网站,销售产品并最终交付产品.为此我们有一个PlaceOrder服务,除了其他参数之外,还需要一个Address对象,在这种情况下(我们的网站下订单)由City,Street和ZipCode组成.

我们还与仅使用我们平台销售产品的合作伙伴开展业务.他们负责交货.对于这种情况,我们有一个PlaceOrderForPartner服务,除了其他对象之外,还需要一个Address对象.但是,在此上下文(合作伙伴下订单)中,Address对象由不同的信息组成,这些信息仅与合作伙伴下达的订单相关.

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

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模板?

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

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

mar*_*c_s 10

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

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

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

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

服务主机(可选 - 可以是Winforms,控制台应用程序,NT服务)
包含用于调试/测试或可能还用于生产的服务主机.

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

在客户端:

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

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

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

这是受到Miguel Castro的极端WCF屏幕的启发,该屏幕采用了DotNet Rocks电视和卡尔富兰克林 - 强烈推荐的屏幕演员!

  • +1提及有用的dnrtv.com剧集. (3认同)