我注意到少数WCF应用程序选择"拆分"它们的对象; 也就是说,除了执行业务逻辑的有意义的类库之外,项目可能还有一个包含DataContracts/Members的DataObjects程序集.
这是不必要的抽象级别吗?是否存在与使用DataContract信息标记现有类库相关的固有邪恶?
另外,另外,您如何处理错误情况?是否通常接受服务抛出的异常(InvalidOperation,ArgumentException等),或者通常是否有一个级别?
将内部业务对象与数据合同/消息合同分离的关键原因是您不希望对应用程序进行内部更改以改变服务合同.如果您正在创建版本化Web服务(具有多个版本的已实现接口),那么您通常只有一个版本的应用程序业务对象具有多个版本的数据协定/消息合同对象.
此外,在复杂的企业集成情况下,您通常会拥有许多应用程序共享的规范数据格式(数据和消息协定),这会强制每个应用程序将规范数据格式映射到其内部对象模型.
如果你想要一个工具来帮助分离数据合同/消息合同等细节,那么请查看Microsoft的Web服务软件工厂http://msdn.microsoft.com/en-us/library/cc487895.aspx哪个有一些解决WCF管道的好方法.
关于excpetions,WCF会自动包装FaultExceptions中的所有异常,这些异常被序列化为线路格式错误.
也可以抛出通用的故障异常,它允许您指定序列化故障中包含的其他详细信息.由于Web服务操作引发的错误是其合同的一部分,因此在操作声明中声明错误是个好主意:
[FaultContract(typeof(AuthenticationFault))] [FaultContract(typeof(AuthorizationFault))] StoreLocationResponse StoreLocation(StoreLocationRequest request);
AuthenticationFault和AuthorizationFault类型都表示要通过线路序列化和发送的其他详细信息,可以按如下方式抛出:
throw new FaultException(new AuthenticationFault());
如果你想要更多的细节,那么大喊; 我一直生活和呼吸这些东西这么长时间我几乎以此为生;)