问题描述
|
我能否对公开我的业务对象的复杂WCF服务进行一些说明。假设我有4个对象:
contact
,organisation
,project
和letter
。
是创建我的服务的最佳方法:
制作4个合约作为“服务对象”,并将对象和预期的操作作为“服务对象”中的值/参数传递?要么
为所有对象及其功能(可能很多)创建合同?
非常感谢,
克里斯
解决方法
根据接口隔离原则,您可能需要考虑将这些内容拆分。
一种典型的方法是每个对象类型具有一个接口(例如一个“服务”)。一个用于
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>
现在,您的每个服务都可以在特定端点上使用:
您的ѭ6at可以达到http://YourServer/MyServices/Contact
您的ѭ8at可以达到http://YourServer/MyServices/Letter
等等....
对于这些地址中的每一个,您现在都可以从客户端添加服务引用-仅添加您真正需要的地址。一个应用可能仅需要其中一项服务,另一应用可能需要两项或三项服务。
, 只是为了添加Marc的非常有帮助的答案,需要对界面进行如下装饰,然后才有机会为服务分别实现的每个合同添加独立的引用。
[ServiceContract(Name=\"Contact\",Namespace=\"YourNamespace.IContactService\")]
public interface IContractService
{
...
}
对于其他接口类似
[ServiceContract(Name=\"Letter\",Namespace=\"YourNamespace.ILetterService\")]
public interface ILetterService
{
...
}
如果不添加这些属性,则无法为公共服务实现的每个合同添加单独的服务引用。