1

首先,这是我的第一个 Stack Overflow 问题,如果我弄错了,请提前道歉!

我正在为内部使用的 CRM 数据库创建服务端点。多个应用程序想要读取和写入此数据库,因此公开 WCF 服务似乎是最好的方法。

我开始使用用于 ORM 的实体框架、用于业务逻辑层的 CSLA 和用于与客户端应用程序通信的标准 WCF 服务。一切都很顺利,直到我查看了 WCF 数据服务并被可爱的 REST 界面、AJAX 客户端的易用性以及使用新技术的乐趣所吸引!

我现在已经用一个 WCF 数据服务替换了大部分 WCF 服务,它直接公开实体框架模型,绕过 CSLA 层。这对于只读操作非常有用,但如果没有一些业务逻辑,我将无法执行其他 CRUD 功能。

我一直在研究拦截器,我当然可以将业务登录放在那里,但我实际上想拦截 POST/Add 操作,将值映射到有问题的 CSLA BusinessBase 类,然后让它完成所有验证并最终保存到数据库。我已经尝试过了,虽然 CSLA 对象按预期工作,但底层 WCF 数据服务框架也保留了它的版本,所以我在 db 中获得了两个条目。

因此,我有几个问题:

1)我可以完全拦截一个变更请求,让我自己的业务对象处理它然后取消WCF数据服务而不抛出异常吗?

2) 是否有更好/标准的方法将业务逻辑层添加到 WCF 数据服务堆栈?到目前为止,我还没有找到一个。

提前致谢,

戴夫

4

1 回答 1

1

不幸的是,如果 WCF 数据服务的底层提供者是实体框架,那么您无法独自完成所有工作。目前我们不支持在这种情况下完全替换部分处理管道。

另一方面,您也许可以玩一些技巧。您可以主要在实体框架上执行此操作。最新版本的 EF 应该允许您覆盖 SaveChanges 调用,以便您可以在那里做任何您想做的事情。因此,想法是您自己处理更改 itnerceptor 中的 Add 操作,然后在 SaveChanges 中还原由 WCF 数据服务创建的更改,并仅从更改拦截器提交更改。或者甚至更好,只需在 SaveChanges 中执行所有操作。

使用 EF 可能还有其他不错的技巧,WCF 数据服务可能会在不知道的情况下使用这些技巧,但我不是 EF 专家可以肯定地说。

目前,拦截器是将业务逻辑分层到 WCF 数据服务(适用于包括 EF 在内的任何提供程序)中的标准方式。

另一种方法是稍微远离 REST。您可以禁止对给定实体集的 POST 请求(您可以从更改拦截器中抛出)并添加服务操作以在您自己的代码中执行添加。在这种情况下,您将拥有完全的控制权,但客户会更难开始工作。

于 2010-06-23T12:29:32.843 回答