首先让我为整个主题的篇幅道歉。这将是相当长的,但我希望确保消息清晰而没有错误。
在公司,我们有一个现有的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,允许我们通过将传入的查询请求映射到我们的业务来从内部业务层读出实体层。 但是,我们希望有一个功能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 *
*------------------*
那么,这会起作用,还是性能会使它变得无用? 或者我在这里错过了球? 我的想法是,我希望重用BUL& B中存储的任何逻辑。来自OData WCF DataService的DAL层。
我正在考虑创建从Data.Services命名空间中的EntityModel类继承的新类,并创建一个新的DataService对象,该对象标记对BUL& B的所有调用。 DAL& API层。但是,我不确定拦截创建和删除资源的请求的位置/对象。
我希望我有点清楚我要解释的内容,我希望有人可以帮助我。
答案 0 :(得分:1)
魔鬼在细节中,但听起来你提出的设计应该起作用。
您可以在DataService类中定义适用于每个人,配置设置和自定义操作的访问权限。在这种情况下,我认为您将更多地关注数据上下文(DataService中的“T”)。
对于上下文,实际上有两个有效的路径:读取和写入。读取通过IQueryable入口点进行。编写LINQ提供程序是一个很好的工作,但NHibernate已经支持这一点,虽然它会返回我想象的我们称之为DAL实体。如果您可以用数据库理解的术语来表达那些,那么您可以使用查询拦截器在此处进行访问检查。
更新路径来自我所了解的您尝试运行更多业务逻辑的位置(您提到验证,额外更新等)。为此,您需要关注IUpdatable实现(如果您使用的是最新版本,则为IDataServiceUpdateProvider)。在这里,您可以使用您想要的任何对象 - 它们可以是DAL对象或业务对象。您可以在DAL中执行所有操作,然后在SaveChanges()上运行验证,或者在业务对象进行验证时执行所有操作。
有两个地方可以从一种物体“跳跃”到另一种物体。一个是在GetResource()API中,您可以在其中获得IQueryable,可能是在DAL实体方面。另一个是在ResolveResource()中,运行时要求对象进行序列化,就像从IQueryable获取一样,所以它可能也是一个DAL实体。
希望这会有所帮助 - 通过非统一API进行统一访问可能很难,但通常非常值得!