我能请得到暴露我的业务对象复杂的WCF服务的一些澄清。比方说,我有4个对象:contact
,organisation
,project
和letter
。WCF多个合同
是创造我的服务最好的办法:
- 让4个合约为“服务对象”,并通过对象和预期的操作值/参数中的“服务对象”?或
- 为所有对象及其功能(可能很多)创建合同?
非常感谢,
克里斯
我能请得到暴露我的业务对象复杂的WCF服务的一些澄清。比方说,我有4个对象:contact
,organisation
,project
和letter
。WCF多个合同
是创造我的服务最好的办法:
非常感谢,
克里斯
按照Interface Segregation Principle,你可能要考虑一下那些分裂的东西了。
一个典型的方法是将每个对象类型有一个接口(例如,一个“服务”) - 例如一个用于Contact
的接口,包含所有需要的和对联系人有用的操作等。
当然,您可能也有处理多种不同类型对象的方法 - 这些方法对于放置在特定服务合约中有点棘手。
而且,与WCF,您可以轻松拥有一个单一的服务实现类,然后又将实现一次这些接口的多 - 例如使用通用代码或通用模式。
但我想这将是重新考虑你的服务合同,将其转换成更小,更易管理的块是个好主意。
更新:
如果你的服务实现类实现四个服务合同,那么你就必须配置它是这样的:
<services>
<service name="YourNamespace.YourServiceImplementation">
<host>
<baseAddresses>
<add baseAddress="http://YourServer/MyServices/" />
</baseAddresses>
</host>
<endpoint name="Contact"
address="Contact"
binding="basicHttpBinding"
contract="YourNamespace.IContactService" />
<endpoint name="Letter"
address="Letter"
binding="basicHttpBinding"
contract="YourNamespace.ILetterService" />
<endpoint name="Organisation"
address="Organisation"
binding="basicHttpBinding"
contract="YourNamespace.IOrganisationService" />
<endpoint name="Project"
address="Project"
binding="basicHttpBinding"
contract="YourNamespace.IProjectService" />
<endpoint name="mex"
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
现在,每个服务的可在一个特定端点:
IContractService
可达在http://YourServer/MyServices/Contact
ILetterService
可达在http://YourServer/MyServices/Letter
等等....
对于每一个这种地址的,你现在可以从客户端添加服务引用 - 只添加那些你真正需要的。一个应用可能只需要这些服务的单一,另一个可能需要两个或三个等
感谢marc_s的回应。我已经尝试了每个对象的单独接口,但是当我使用VS10中的“添加服务引用”对话框时,我无法找到它们。我可以找到我的mex端点,但我只能配置我的app.config来显示一个接口/合同。如果我点击界面,我将显示其操作列表,但是如何在“添加服务参考”对话框中添加更多的服务树视图服务分支下的一种界面类型。 –
您将在服务的配置文件中拥有单个服务(实现) - 但每个协议都可以公开不同的端点(=不同的服务地址)。所以你可以有一个单独的实现,但是公开了五个不同的端点(在五个不同的地址上) - 并且Add Service Reference将违背一个端点,所以它会一直向你显示那个单一合约的操作(例如' Contact')。如果你想使用所有五六个服务合同,你需要添加五个或六个服务引用(对每个端点) –
我已经设法增加一个合同到一个服务,并且似乎都按照计划进行。感谢您的验证。我对自己了解合同是什么感到困惑。它是我的界面,而不是与界面相关的单个操作。我非常高兴谢谢你的时间 –
只需添加到由Marc非常有用的答案,该接口需要被装饰成以下,然后只,我们得到机会分别为服务实施的每份合同添加独立参考。
[ServiceContract(Name="Contact", Namespace="YourNamespace.IContactService")]
public interface IContractService
{
...
}
同样,对于其他接口
[ServiceContract(Name="Letter", Namespace="YourNamespace.ILetterService")]
public interface ILetterService
{
...
}
无需添加这些属性,我无法单独的服务refernce添加到每个由公共服务实现的合同。
问这个问题的原因,目前我有一个名为contact_function1,contact_function2 ..... organisation_function1,organsiation_function2和我的服务文件变得相当长的服务中的所有功能。 –