wcf - 具有 NHibernate 和企业业务逻辑的 OData WCF 数据服务

标签 wcf nhibernate odata dataservice

让我首先为整个主题的长度道歉。这将是相当长的,但我希望确保消息清晰无误。

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

这个 API 存在了一段时间,但最终请求来创建一个新的 API,它是 RESTfull 并依赖于新技术。我被分配了这个任务,我使用 Microsoft MVC 2 框架创建了初始 API,在我们的 ASP.NET WebApplication 中运行。这最初需要一些时间才能使其正常运行,但目前我们能够对应用程序进行 REST 调用以接收详细说明我们资源的 XML。

我参加了 Microsoft WebCamp,并立即被 OData 概念所吸引。这与我们所做的非常相似,但这是一个被更多玩家支持的协议(protocol),而不是我们自己的实现。目前,我正在研究 PoC(概念证明)来重新创建我使用 OData 协议(protocol)和 WCF DataService 技术开发的 API。

在互联网上搜索让 NHibernate 2 与数据服务一起工作后,我成功地创建了 API 的只读版本,它允许我们通过将传入的查询请求映射到我们的业务层来从内部业务层读取实体。
但是,我们希望有一个功能性 API,它还允许使用 OData 协议(protocol)创建实体。所以现在我有点坚持如何继续。我一直在阅读以下文章:http://weblogs.asp.net/cibrax/default.aspx?PageIndex=3

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

所以我想问的是,我例如像上面一样创建自己的 NhibernateContext 类,而是依赖我们的业务层而不是 NHibernate session ,它可以工作吗?我可能不得不大量依赖反射来确定我在运行时使用的对象的类型,并调用正确的业务类来执行更新和删除。

用 smal ascii 图片演示:

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

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

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

                                                 *------------------*
                                                 * Web Application  *
                                                 *------------------*

那么,这会起作用,还是性能会使其无用?
还是我只是在这里错过了球?
这个想法是我希望重用存储在 OData WCF 数据服务中的 BUL 和 DAL 层中的任何逻辑。

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

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

最佳答案

魔鬼在细节中,但听起来您提出的设计应该可行。

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

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

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

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

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

关于wcf - 具有 NHibernate 和企业业务逻辑的 OData WCF 数据服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4970161/

相关文章:

wcf - ClientCredentialType=Windows 和 =Ntlm 之间的区别

nhibernate - 使用 FluentNHibernate 的相同实体关系

NHibernate: "collection was not processed by flush()"延迟加载问题导致

nhibernate - 如果什么也没找到,为什么 Session.Load<User>(id) 不返回 null?

error-handling - 如何在Kapsel离线应用程序中访问SAP OData消息?

asp.net - 如何根据内部数组使用 OData 进行过滤?

c# - 记录 WCF 接口(interface)的最佳方式?

javascript - 从wcf服务返回的json日期不一致

c# - 客户端服务器24/7监听器

c# - 处理 DataServiceContext?