具有NHibernate和公司业务逻辑的OData WCF数据服务

cod*_*nny 5 nhibernate wcf dataservice odata

首先让我为整个主题的篇幅道歉.这将是相当长的,但我希望确保消息清晰而没有错误.

在公司,我们有一个现有的ASP.NET WebApplication.在.NET Framework 3.5 SP1上用C#ASP.NET编写.前段时间,使用WCF和SOAP为此Web应用程序开发了一个初始API,以允许外部各方与应用程序通信,而无需依赖浏览器.

这个API存活了一段时间,但最终请求创建了一个RESTfull并依赖于新技术的新API.我得到了这个任务,我使用Microsoft MVC 2 Framework创建了初始API,在我们的ASP.NET WebApplication中运行.最初安静一段时间才能使其正常运行,但目前我们能够在应用程序上进行REST调用以接收详细说明我们资源的XML.

我参加了一个微软的WebCamp,我立即被OData概念出售.它与我们正在做的非常相似,但这是一个由更多玩家支持的协议,而不是我们自己的实现.目前我正在开发一个PoC(概念证明)来重新创建我使用OData协议和WCF DataService技术开发的API.

在搜索Internet以获取NHibernate 2以使用Data Services之后,我成功创建了一个ReadOnly版本的API,允许我们通过将传入的查询请求映射到我们的Business层来从内部业务层读出实体.但是,我们希望有一个功能API,它也允许使用OData协议创建实体.所以现在我有点坚持如何继续.我一直在阅读以下文章:http://weblogs.asp.net/cibrax/default.aspx?PageIndex = 3

上面清楚地解释了如何将自定义DataService映射到NHibernate层.我已经使用它作为继续的基础,但我有"问题",我不想使用NHibernate将我的请求直接映射到数据库,但我希望将它们映射到我们的业务层(一个单独的DLL) )根据访问权限,权限和触发器执行大量检查,约束和更新.

所以我要问的是,我举例来说,如上所述创建我自己的NhibernateContext类,但是依赖于我们的业务层而不是NHibernate会话,它可以工作吗?我可能不得不依赖反射来计算我在运行时使用的对象的类型,并调用正确的业务类来执行更新和删除.

用小ascii图片演示:

                              *-----------------*
                              *   Database      *
                              *-----------------*

                              *------------------------*
                              * DAL(Data Access Layer) *
                              *------------------------*

                              *------------------------*
                              * BUL (Bussiness Layer)  *
                              *------------------------*
                              *---------------*  *-------------------*
                              * My OData stuff*  * Internal API      *
                              *---------------*  *-------------------*

                                                 *------------------*
                                                 * Web Application  *
                                                 *------------------*
Run Code Online (Sandbox Code Playgroud)

那么,这会起作用,还是性能会使它变得无用?或者我在这里错过了球?我的想法是,我希望重用OData WCF DataService中存储在BUL&DAL层中的任何逻辑.

我正在考虑创建从Data.Services命名空间中的EntityModel类继承的新类,并创建一个新的DataService对象,该对象标记对BUL&DAL和API层的所有调用.但是,我不确定拦截创建和删除资源的请求的位置/对象.

我希望我有点清楚我要解释的内容,我希望有人可以帮助我.

小智 1

细节决定成败,但听起来你提出的设计应该可行。

您可以在 DataService 类中定义适用于每个人的访问权限、配置设置和自定义操作。在这种情况下,我认为您将更多地关注数据上下文(DataService 中的“T”)。

对于上下文,确实有两个有趣的路径:读取和写入。读取通过 IQueryable 入口点进行。编写 LINQ 提供程序是一项艰巨的工作,但 NHibernate 已经支持这一点,尽管它会返回我想象中的 DAL 实体。如果您可以用数据库可以理解的术语表达这些内容,则可以在此处使用查询拦截器进行访问检查。

更新路径来自我所理解的您试图运行更多业务逻辑的地方(您提到了验证、额外更新等)。为此,您需要关注 IUpdatable 实现(如果您使用的是最新版本,则为 IDataServiceUpdateProvider)。在这里您可以使用任何您想要的对象 - 它们可以是 DAL 对象或业务对象。您可以在 DAL 中执行所有操作,然后在 SaveChanges() 上运行验证,或者在业务对象上执行所有操作(如果它们在运行时进行验证)。

您可以在两个地方从一种对象“跳”到另一种对象。一种是在 GetResource() API 中,您可以在其中获取 IQueryable,大概是 DAL 实体的形式。另一个是在 ResolveResource() 中,运行时要求一个对象进行序列化,就像从 IQueryable 中获取一样,因此它可能也是一个 DAL 实体。

希望这会有所帮助 - 对非统一 API 进行统一访问可能很困难,但通常非常值得!