WCF数据服务如何添加业务逻辑或使用现有的CSLA对象

WCF数据服务如何添加业务逻辑或使用现有的CSLA对象,wcf,wcf-data-services,csla,Wcf,Wcf Data Services,Csla,首先,这是我的第一个堆栈溢出问题,如果我弄错了,请提前道歉 我正在为内部使用的CRM数据库创建一个服务端点。有几个应用程序希望读取和写入该数据库,因此公开WCF服务似乎是最好的方法 我开始使用ORM的实体框架、业务逻辑层的CSLA和与客户机应用程序通信的标准WCF服务。一切都很顺利,直到我看到了WCF数据服务,并被可爱的REST界面、AJAX客户端的易用性和使用新技术的乐趣所吸引 我现在已经用单个WCF数据服务替换了大部分WCF服务,该服务绕过CSLA层直接公开实体框架模型。这对于只读操作非常有

首先,这是我的第一个堆栈溢出问题,如果我弄错了,请提前道歉

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

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

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

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

因此,我有几个问题:

1) 我是否可以完全拦截更改请求,让我自己的业务对象处理它,然后在不引发异常的情况下取消WCF数据服务

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

提前感谢,


Dave

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

另一方面,你可能会玩一些把戏。您可以在实体框架上完成这项工作。EF的最新版本应该允许您覆盖SaveChanges调用,这样您就可以在那里做任何您想做的事情。因此,您可以自己在change ItneReceptor中处理Add操作,然后在SaveChanges中还原WCF Data Services创建的更改,并仅从更改拦截器提交更改。或者更好,只需在SaveChanges中执行所有操作

可能还有其他一些很好的技巧可以使用EF,WCF数据服务可能会在不知情的情况下使用这些技巧,但我不是EF专家

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


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

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

另一方面,你可能会玩一些把戏。您可以在实体框架上完成这项工作。EF的最新版本应该允许您覆盖SaveChanges调用,这样您就可以在那里做任何您想做的事情。因此,您可以自己在change ItneReceptor中处理Add操作,然后在SaveChanges中还原WCF Data Services创建的更改,并仅从更改拦截器提交更改。或者更好,只需在SaveChanges中执行所有操作

可能还有其他一些很好的技巧可以使用EF,WCF数据服务可能会在不知情的情况下使用这些技巧,但我不是EF专家

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

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