EntityEngine引擎.doc_第1页
EntityEngine引擎.doc_第2页
EntityEngine引擎.doc_第3页
EntityEngine引擎.doc_第4页
EntityEngine引擎.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

演示地址:http:/www.silks.cc/隔了很长时间,终于又有时间可以坐下来写写文章了。按照大纲的顺序,今天介绍整个实体引擎(EntityEngine)的设计,以及如何使用它来完成各种数据库操作。首先来看一下EntityEngine引擎中相关的几个关键的类。图片看不清楚?请点击这里查看原图(大图)。当用户要对数据库做某个操作时,需要先创建一个EntityRequest实例,然后将该实例传给 RequestBuilder,RequestBuilder会对该实例做进一步的一些通用的初始化操作,比如设置请求的类型。 EntityRequest创建完成后,根据该EntityRequest实例进一步创建一个RequestBinder实例,该实例的作用是将当前的 EntityRequest实例和一个EntityReply实例绑定起来。然后框架就会把这个RequestBinder实例发送传给 EntityEngine引擎,EntityEngine引擎调用EntityManager来处理请求,而EntityManager则调用一个 EntityProvider实例来真正操作数据库。请求执行完成后,会更新EntityReply实例,EntityReply中包含了一个 Entity实例,这个Entity实例可以是任意数据,可以是单个实体,也可以是一个集合。以上就是EntityEngine引擎的大致执行流程。下面再明确列一下这几个类的主要职责或作用:EntityRequest:提供一个类,用来表示用户的请求,存放请求的一切相关数据;RequestBuilder:设置请求类型,或者根据一些参数来创建一个请求(EntityRequest);-2-RequestBinder:将请求和一个回复(EntityReply)捆绑,即建立对应关系;EntityEngine:发送一个请求,当然实际上发送的是RequestBinder;EntityManager:一个实体管理类,提供如CRUD等操作,它内部调用一个EntityProvider实例来完成真正的数据库操作;EntityProvider:它是一个Provider实例,提供了操作数据库的统一接口,该类会调用ADO.NET完成数据库的操作;EntityReply:表示请求的回复,一个EntityRequest对应一个EntityReply;EntityReply中包含了请求的所有结果信息;Entity:一个抽象类,一个应用中所有的真实实体类都继承自它,它能表示单个实体对象,也能表示一个集合对象;EntityList:表示一个包含多个Entity的集合,但它也是集成自Entity的;好了,了解了EntityEngine引擎的大致流程以及每个关键类的功能后,我想就可以举个简单的例子来说明具体应该如何来使用这些类。就以发表帖子这个功能来举例吧:1. 在ThreadAdd.cs文件中,当用户点击发帖按钮后,会执行SaveThread方法,该函数首先创建一个Thread实例,即创建一个帖子实例,然后设置帖子的相关信息,然后调用BusinessManager.CreateThread方法来创建帖子到数据库。代码如下:1privatevoidSaveThread(objectsender,EventArgse)23/检查版块是否存在4if(section=null)56thrownewException(请确认您所在的版块是存在的。);789/获取当前帖子10Threadthread=newThread();1112/设置帖子属性13thread.GroupId.Value=section.GroupId.Value;14thread.SectionId.Value=section.EntityId.Value;15thread.Subject.Value=subjectTextBox.Value;16thread.ThreadMarks.Value=int.Parse(threadMarksTextBox.Value);17thread.Body.Value=bodyEditor.Value;18thread.ThreadStatus.Value=(int)ThreadStatus.Normal;19thread.AuthorId.Value=CurrentUser.EntityId.Value;20thread.Author.Value=CurrentUser.NickName.Value=null?:CurrentUser.NickName.Value;21thread.CreateDate.Value=DateTime.Now;22thread.UpdateDate.Value=DateTime.Now;23thread.StickDate.Value=DateTime.Parse(1753-01-01);24thread.TotalViews.Value=0;2526/添加帖子27BusinessManager.CreateThread(thread);2829/返回列表页面30Page.Response.Redirect(SiteUrls.Instance.GetThreadsUrl(int)ThreadOrderType.UpdateDate,31(int)ThreadStatus.Normal,(int)ThreadReleaseStatus.Open,section.EntityId.Value);32-3-2. BusinessManager.cs文件:1privatestaticEntityEngineentityEngine=newEntityEngine();2publicstaticvoidCreateThread(Threadthread)34entityEngine.ExecuteRequest(RequestHelper.BuildAddThreadRequest(thread);5该方法的实现非常简单,就是调用RequestHelper创建一个RequestBinder实例,然后直接调用一个静态的 EntityEngine实例的ExecuteRequest静态方法。前面说过,EntityEngine主要负责接收并发送 RequestBinder。接下来再看看RequestHelper是如何创建一个RequestBinder的?3. RequestHelper.cs文件:1publicstaticBaseRequestBinderBuildAddThreadRequest(Threadthread)23returnnewTBaseRequestBinder4(5RequestBuilder.BuildAddEntityRequest(thread)6);7这个函数也非常简单,首先将刚才创建的Thread实例传给RequstBuilder类的静态方法BuildAddEntityRequest方法,然后该方法就返回一个EntityRequest的实例,然后再把这个实例传给RequestBinder的构造函数,最终创建出一个 RequestBinder实例;下面在看看RequestBuilder的BuildAddEntityRequest做了什么呢?4. RequestBuilder.cs文件:1publicstaticTRequestBuildAddEntityRequest(Entityentity)whereTRequest:EntityRequest,new()23TRequestrequest=newTRequest();4request.Operation=OperationType.Add;5request.Entity=entity;6returnrequest;7-4-由于用到了泛型,所以根据动态传入进来的类型创建一个EntityRequest实例,在这个例子中就是ThreadRequest。另外由于是新增的操作,所以还要再将该Request标记为Add,然后就是将要保存的Thread实例保存到EntityRequest中,以便告诉框架要保存的信息。好,现在对EntityRequest是如何创建出来的应该有所了解了,先看接下去看看这个Request是如何被发送和执行的。接下来转到 EntityEngine的ExecuteRequest方法,该方法负责接收和发送Request。5. EntityEngine.cs文件:1/2/同步发送单个给定的请求,并直接返回请求结果.3/4publicBaseReplyExecuteRequest(BaseRequestBinderrequestBinder)56returnrequestBinder.ExecuteRequest();7该方法的实现非常简单,就是直接调用RequestBinder的ExecuteRequest方法发送Request。6. RequestBinder.cs文件:1publicoverrideBaseReplyExecuteRequest()23returnRequest.Send(this);4前面分析过,一个RequestBinder会将一个Request和一个Reply进行捆绑。所以它自然会至少包含对这两个实例的引用。而它的ExecuteRequest方法也非常简单,直接调用Request实例的Send方法去发送Request,当然发送时需要将 RequestBinder实例的引用传递进去,因为在EntityManager处理一个Request的时候,会把相应的返回信息保存到当前 Request对应的Reply中。下面看看EntityRequest是如何发送请求的。7. EntityRequest.cs文件:1publicoverrideBaseReplySend(BaseRequestBinderrequestBinder)23BaseReplyreply=requestBinder.Reply;4SqlResultresult;56switch(Operation)78caseOperationType.Get:9reply.Reply=EntityManager.GetEntity(requestBinder);10break;11caseOperationType.Add:12result=EntityManager.CreateEntity(requestBinder);13reply.Status=result.Status;14reply.Log=result.Message;15break;16caseOperationType.Update:17result=EntityManager.UpdateEntity(requestBinder);18reply.Status=result.Status;19reply.Log=result.Message;20break;21caseOperationType.Delete:22result=EntityManager.DeleteEntity(requestBinder);23reply.Status=result.Status;24reply.Log=result.Message;25break;262728returnreply;29-5-由于用到了泛型,所以根据动态传入进来的类型创建一个EntityRequest实例,在这个例子中就是ThreadRequest。另外由于是新增的操作,所以还要再将该Request标记为Add,然后就是将要保存的Thread实例保存到EntityRequest中,以便告诉框架要保存的信息。好,现在对EntityRequest是如何创建出来的应该有所了解了,先看接下去看看这个Request是如何被发送和执行的。接下来转到 EntityEngine的ExecuteRequest方法,该方法负责接收和发送Request。5. EntityEngine.cs文件:1/2/同步发送单个给定的请求,并直接返回请求结果.3/4publicBaseReplyExecuteRequest(BaseRequestBinderrequestBinder)56returnrequestBinder.ExecuteRequest();7该方法的实现非常简单,就是直接调用RequestBinder的ExecuteRequest方法发送Request。6. RequestBinder.cs文件:1publicoverrideBaseReplyExecuteRequest()23returnRequest.Send(this);4前面分析过,一个RequestBinder会将一个Request和一个Reply进行捆绑。所以它自然会至少包含对这两个实例的引用。而它的ExecuteRequest方法也非常简单,直接调用Request实例的Send方法去发送Request,当然发送时需要将 RequestBinder实例的引用传递进去,因为在EntityManager处理一个Request的时候,会把相应的返回信息保存到当前 Request对应的Reply中。下面看看EntityRequest是如何发送请求的。7. EntityRequest.cs文件:1publicoverrideBaseReplySend(BaseRequestBinderrequestBinder)23BaseReplyreply=requestBinder.Reply;4SqlResultresult;56switch(Operation)78caseOperationType.Get:9reply.Reply=EntityManager.GetEntity(requestBinder);10break;11caseOperationType.Add:12result=EntityManager.CreateEntity(requestBinder);13reply.Status=result.Status;14reply.Log=result.Message;15break;16caseOperationType.Update:17result=EntityManager.UpdateEntity(requestBinder);18reply.Status=result.Status;19reply.Log=result.Message;20break;21caseOperationType.Delete:22result=EntityManager.DeleteEntity(requestBinder);23reply.Status=result.Status;24reply.Log=result.Message;25break;262728returnreply;29-6-由于用到了泛型,所以根据动态传入进来的类型创建一个EntityRequest实例,在这个例子中就是ThreadRequest。另外由于是新增的操作,所以还要再将该Request标记为Add,然后就是将要保存的Thread实例保存到EntityRequest中,以便告诉框架要保存的信息。好,现在对EntityRequest是如何创建出来的应该有所了解了,先看接下去看看这个Request是如何被发送和执行的。接下来转到 EntityEngine的ExecuteRequest方法,该方法负责接收和发送Request。5. EntityEngine.cs文件:1/2/同步发送单个给定的请求,并直接返回请求结果.3/4publicBaseReplyExecuteRequest(BaseRequestBinderrequestBinder)56returnrequestBinder.ExecuteRequest();7该方法的实现非常简单,就是直接调用RequestBinder的ExecuteRequest方法发送Request。6. RequestBinder.cs文件:1publicoverrideBaseReplyExecuteRequest()23returnRequest.Send(this);4前面分析过,一个RequestBinder会将一个Request和一个Reply进行捆绑。所以它自然会至少包含对这两个实例的引用。而它的ExecuteRequest方法也非常简单,直接调用Request实例的Send方法去发送Request,当然发送时需要将 RequestBinder实例的引用传递进去,因为在EntityManager处理一个Request的时候,会把相应的返回信息保存到当前 Request对应的Reply中。下面看看EntityRequest是如何发送请求的。7. EntityRequest.cs文件:1publicoverrideBaseReplySend(BaseRequestBinderrequestBinder)23BaseReplyreply=requestBinder.Reply;4SqlResultresult;56switch(Operation)78caseOperationType.Get:9reply.Reply=EntityManager.GetEntity(requestBinder);10break;11caseOperationType.Add:12result=EntityManager.CreateEntity(requestBinder);13reply.Status=result.Status;14reply.Log=result.Message;15break;16caseOperationType.Update:17result=EntityManager.UpdateEntity(requestBinder);18reply.Status=result.Status;19reply.Log=result.Message;20break;21caseOperationType.Delete:22result=EntityManager.DeleteEntity(requestBinder);23reply.Status=result.Status;24reply.Log=result.Message;25break;262728returnreply;29-7-果然如此,这个函数的代码一目了然,就是一些简单的常用的ADO.NET操作的代码。首先实例化一个SqlCommand,然后设置该 SqlCommand的参数信息,然后执行该SqlCommand,然后将Output的参数设置到EntityReply中,如果有的话。最后关闭数据库连接。好,到这里位置,当前请求算是执行完成了,接下来看看如何获取Reply,以及如何判断当前请求执行是否成功。因为当前这个例子是发表帖子,所以我们优势常常不会去判断是否成功。因为如果默认没有发生异常的话,就简单的认为已经成功了。当然如果你真的想获取这些信息的话,就从Reply中去获取吧。下面再来看看最初发表帖子时的代码:1privatevoidSaveThread(objectsender,EventArgse)23/检查版块是否存在4if(section=null)56thrownewException(请确认您所在的版块是存在的。);789/获取当前帖子10Threadthread=newThread();1112/设置帖子属性13thread.GroupId.Value=section.GroupId.Value;14thread.SectionId.Value=section.EntityId.Value;15thread.Subject.Value=subjectTextBox.Value;16thread.ThreadMarks.Value=int.Parse(threadMarksTextBox.Value);17thread.Body.Value=bodyEditor.Value;18thread.ThreadStatus.Value=(int)ThreadStatus.Normal;19thread.AuthorId.Value=CurrentUser.EntityId.Value;20thread.Author.Value=CurrentUser.NickName.Value=null?:CurrentUser.NickName.Value;21thread.CreateDate.Value=DateTime.Now;22thread.UpdateDate.Value=DateTime.Now;23thread.StickDate.Value=DateTime.Parse(1753-01-01);24thread.TotalViews.Value=0;2526/添加帖子27BusinessManager.CreateThread(thread);2829/返回列表页面30Page.Response.Redirect(SiteUrls.Instance.GetThreadsUrl(int)ThreadOrderType.UpdateDate,31(int)ThreadStatus.Normal,(int)ThreadReleaseStatus.Open,section.EntityId.Value);32-8-可以看到,我在调用BusinessManager的CreateThread方法创建帖子的时候,并没有关心其返回值,我这里偷懒了,我想真正的网站不应该如此,应该如下面这样:1privatevoidSaveThread(objectsender,EventArgse)23/检查版块是否存在4if(section=null)56thrownewException(请确认您所在的版块是存在的。);789/获取当前帖子10Threadthread=newThread();1112/设置帖子属性13thread.GroupId.Value=section.GroupId.Value;14thread.SectionId.Value=section.EntityId.Value;15thread.Subject.Value=subjectTextBox.Value;16thread.ThreadMarks.Value=int.Parse(threadMarksTextBox.Value);17thread.Body.Value=bodyEditor.Value;18thread.ThreadStatus.Val

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论