我是否可以对公开我的业务对象的复杂WCF服务做一些澄清。假设我有4个对象:contact
,organisation
,project
和letter
。
是创建服务的最佳方式:
非常感谢,
克里斯
答案 0 :(得分:8)
根据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
依旧......
对于每个地址,您现在可以从客户端添加服务引用 - 仅添加您真正需要的服务引用。一个应用程序可能只需要一个服务,另一个可能需要两个或三个等。
答案 1 :(得分:1)
只是为了添加Marc非常有用的答案,接口需要按照下面的方式进行修饰,然后我们才有机会为服务分别实施的每个合同添加一个独立的引用。
[ServiceContract(Name="Contact", Namespace="YourNamespace.IContactService")]
public interface IContractService
{
...
}
与其他界面类似
[ServiceContract(Name="Letter", Namespace="YourNamespace.ILetterService")]
public interface ILetterService
{
...
}
如果不添加这些属性,我无法为公共服务实施的每个合同添加单独的服务引用。