




已阅读5页,还剩65页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.net企业级架构实战之1框架综述 是java下大名鼎鼎的spring框架移植到.net的开源项目,且借助于.net强大的反射机制,甚至拥有比原java版本更强大的功能。那它能用来做什么呢?核心功能就是IOC和AOP:IOC(Inversion of Control),字面意思为“反转控制”,我更倾向于理解为“依赖注入”,意思就是说:在基于接口开发的情况下,我们会对需要的业务处理对象(数据访问,业务逻辑等)一一做上接口,前端使用时只是对接口的调用,而并不关心具体是什么类具体去实现了这个接口听起来似乎不可能,是的,如果没有IOC,这是不可能的事情,我们的前端逻辑和后端实现是紧紧耦合的,做页面开发的人必须知道哪一个类(.cs文件)拥有哪些方法,即便是基于接口,我们也依然要在程序里去实例化它,形如: 1. IManager mgr = new DataManager();复制代码无形中,基于接口开发成了鸡肋,前端开发人员几乎要知道一条龙的编码流程才能做业务开发!(当然,有的项目就是一个人在做)好吧,那就使用IOC,它是怎么解开这个耦合关系的?IOC框架一般会维护一个配置文件,它大概要完成的使命是:1、将实现接口的对象进行列表,表示它们是被页面需要的;2、把页面的以基于URL的形式进行列表,表示它们是需求方。余下的事情,是框架来进行协调,在页面上声明一下某一个接口的对象,在它需要实例化时,IOC框架会自动将对应的接口实现进行注入。如下就是一个S的配置范例片断: 1. 2. 3.4. 5. 复制代码再看看页面里的声明和调用片断: 1. using System;2. using System.Data;3. using System.Configuration;4. using System.Collections.Generic;5. using System.Web;6. using System.Web.Security;7. using System.Web.UI;8. using System.Web.UI.WebControls;9. using System.Web.UI.WebControls.WebParts;10. using System.Web.UI.HtmlControls;11. using System.Text;12. using woodigg.model;13. using woodigg.Interface.DAO;14. using woodigg.bll.Tool;15. using Spring.Context;16. using Spring.Context.Support;17.18. public partial class Admin_Artist_MgrArt : AdminPage19. 20. #region 注入对象21. private IArtistDAO _ArtistDaoSpring;22. public IArtistDAO ArtistDaoSpring23. 24. get return _ArtistDaoSpring; 25. set _ArtistDaoSpring = value; 26. 27. #endregion28.29. protected void Page_Load(object sender, EventArgs e)30. 31. GridView1.DataSource =ArtistDaoSpring.GetAllArtists();32. GridView1.DataBind();33. 34. 复制代码如果是初次接触IOC,可能理解起来会有些生涩,毕竟是个基于配置的框架,有些东西需要深入了解,这个以后可以一步步探个究竟。OK,接着就是AOP。那么AOP又是做什么的呢?Aspect Oriented Programming,字面意思即为“面向切面的编程”。Aspect,就是切面,代表了我们很多项目中重复开发的模块,如邮件功能,日志功能等。说起来是会让人很颓废的,我们花费在重复劳动上的时间,有时太多了。这个项目写日志,下一个还写日志,日志有区别吗?答案是没有,但它就是需要,哪怕是复制粘贴,还是需要!被需要当然是好事,说明它存在的价值,但能否把这样的东西做成一个组件,以后拿来就用,并且与新的项目系统人我两不犯,无缝集成?当然是可以的,AOP在此时的价值会得到充分的体现。就我个人而言,对它的理解,更多的是一个监听器,侦测你的业务是否有相关的需要,只要你有需要发出,AOP框架就会在你需要的地方设一个断点,进行功能模块的切入,让它去做你希望它做的事。就这么神奇这里放出一个代码片断,小小注解一下以上比较让人头晕的概念: 1. using System;2. using System.Collections.Generic;3. using System.Text;4. using System.Reflection;5. using woodigg.model;6. using woodigg.DAO;7. using Spring.Aop;8. using AopAlliance.Intercept;9.10. namespace woodigg.bll11. 12. / 13. / 环绕通知14. / 15. public class whenUserSaveAdvice : IMethodInterceptor16. 17. public object Invoke(IMethodInvocation invocation)18. 19. User user = (User)invocation.Arguments0;20. Logger.ErrorLog(invocation.Method.Name, user.Name, user.Name);21. /真正的调用目标方法,并得到返回值22. Object obj = invocation.Proceed();23. return obj;24. 25. 26. 复制代码这一代码片断实现的功能是:如果发现系统中新增了一个用户(即User的业务管理器调用了Save方法),那么在日志系统中,存储一下用户名,让管理员可以在翻日志时知道谁又加入了当然,就这么一段代码并不能完成这个监控功能,同样的,我们必须做配置(S把开发提高到了对配置进行管理的境地,你在配置管理上花的时间,将大于以往,好处是更关注和贴近业务而不是代码),告诉AOP框架,我们希望监听哪些对象的哪些动作,以及监听到后我们要调用哪些模块来采取行动: 1. 2. 3. 4. 5. 6. 7.8. 9. 10. 11. 12. 14. 15. 16. save*17. 18. 19. 20. 21. 22. 23. 25. 26. woodigg.Interface.DAO.IUserDAO27. 28. 29. 30. advisor31. 32. 33. 34. 35. 36. 复制代码也许这样的配置片断更让人犯晕,没关系,习惯了就好,有些事情需要我们自己去做(DB,ENTITY,DAO,BLL开发),有些事情需要的是我们去理解(AOP框架,通知,切面,代理对象),相信不需要多长时间,这些都不是问题。关于IOC和AOP,以上只是寥寥几笔带过,在以后的实例系列中,将各个击破实例主要围绕的是一个音乐网站的搭建(有点儿像AllMusic内样的,而不同于别的什么无聊SNS社区),会涉及的内容是:S、nHibernate、codeSmith模板、多对多表结构、Castle MonoRail(虽然有人强建不建议把MonoRail集成到S中,但我至今没找到.net 2.0下好的MVC解决方案,用用MonoRail有助于更好理解MVC,优化性能)。(文/莫耶).net企业级架构实战之2S对象装配 之所以启用,看中的是它的容器功能:一个可以管理对象整个生命周期的容器。在这个容器内,我们加入各种对象的定义信息,让它们自动地装配(类似于乐高积木,定制化的拼合)、实例化、事务协作、回收销毁,以适应系统的需要。如前所述,基于配置运作。要让的容器感知我们编写的对象,需要做的就是在配置文件中声明它们。所谓配置,载体当然是xml文件,定义明晰,清清楚楚。看一个xml配置片断: 1. 2. 6. 7. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 复制代码解释一下:这是一个并不复杂的控制器类ArtistController,我们声明了它的id和type(类型,类在程序集中完整路径及程序集名)。这样,的对象工厂(ObjectFactory或者ApplicationContext)在感知到对它的调用请求时,会实例化它并返回给需求方(可以是一个类,一个aspx页面,一个asmx,或者别的什么)事实比这复杂得多,诸如你可以显式地声明它是单例的(加一个属性 singleton=true,鄙人用的版本为),如此一来在容器生命周期内,它不会再有第二个实例,也许有时这会派上用场,能节省一些开销。继续观察,节内会有一些声明,这是object的属性声明,name即它在内部对外公开的名称,其后可以使用value(值),ref(引用对象)或者expression(表达式)。此例使用的ref引用,意味着容器将干涉内政把需要的对象注入到object的字段里,前提是:ref指定的对象存在于容器装载的配置文件集合中,并以相同的id声明。势必存在另一个配置,形如: 1. 2. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 复制代码在这个稍显简单的供求关系中,它们是供方,被需要、被别的对象引用,容器会在那个ref它们的对象(ArtistController)涉及到指定字段被使用时,提供其实例,比如ArtistController有个叫abc的方法中,用到了ArtistDaoSpring字段的defg()方法,容器接收到这一信息,装配ArtistDaoSpring字段对应的woodigg.DAO.ArtistDaoSpring对象你也许会说,直接实例化不就完了么?呵呵,如果这个对象也是基于别的组件装配出来的,那就不仅仅只是实例化一下,还是需要重复一下这个过程,递归着来,搭积木一般把它装配成功交付需求方(像极了这个商业社会的产业链)。在这里,我们还看到一个属性autowire,它可以有几种枚举选值(no,byName,byType,constuctor,autodetect,default),而byName的意思就是让容器按名称,自行查找同名的对象,进行装配(id和类中的字段同名)。看到这里,想必有人会说,你的第一个配置ArtistController,简直就是废话连篇,在object上指定autowire=byName就行了,何必一个个指定property?bingo!如果不是为了说明供求关系,我才懒得写这些property,让容器查找吧。ok,以上皆为务虚,来务实一把,装配一个简单.net对象(pono?)到一个.aspx页面耍耍。这个简单对象RouteMap,是为A MVC框架服务的由于还无福使用WIN2008+IIS7,只得在.net 2.0下奋战,对于new action=Home,c这么潇洒的范式自然也是只能眼馋。没关系!自己扩展吧: 1. using System;2.3. / 4. / A mvc RouteMap 5. / 6. namespace woodigg.controllers7. 8. public class RouteMap9. 10. private string _controller;11. private string _action;12. private string _id;13.14. public string Controller15. 16. get return this._controller; 17. set this._controller = value; 18. 19.20. public string Action21. 22. get return this._action; 23. set this._action = value; 24. 25.26. public string Id27. 28. get return this._id; 29. set this._id = value; 30. 31.32. public RouteMap(string controller, string action, string id)33. 34. this._controller = controller;35. this._action = action;36. this._id = id;37. 38. 39. 复制代码RouteMap将被一个叫test.aspx页面需要。它长这样: 1. using System;2. using System.Data;3. using System.Configuration;4. using System.Collections;5. using System.Web;6. using System.Web.Security;7. using System.Web.UI;8. using System.Web.UI.WebControls;9. using System.Web.UI.WebControls.WebParts;10. using System.Web.UI.HtmlControls;11.12. public partial class test : System.Web.UI.Page13. 14. #region 注入对象15. private woodigg.controllers.RouteMap _ArtistRoutmap;16. public woodigg.controllers.RouteMap ArtistRoutmap17. 18. get return this._ArtistRoutmap; 19. set this._ArtistRoutmap = value; 20. 21. #endregion22.23. protected void Page_Load(object sender, EventArgs e)24. 25. Response.Write(ArtistRoutmap.Controller);26. 27. 复制代码它会在页面加载完成时,输出这个RouteMap的控制器名称。至于这东西到底从哪来的值,没有说明。那么,就为这俩构造一个配置,由容器来装配它们。新建一个routemap.xml文件,放在网站的/config目录下,形如: 1. 2. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.16. 复制代码ArtistRoutmap在被实例化时,我们希望它是有默认值的,在配置中逐一指定它构造函数参数项的值,这很好理解。页面对象的声明更简单,只需说明它在站点中存在的路径,字段引用按名称查找吧。累述至此,对象装配已经完成,但要让容器自动的运转起来,还需要在站点层面做些配置:、引用程序集及相关(以为例,如有出入,稍为调整),包括:Spring.core.dll,Spring.web.dll,Spring.Web.Extensions.dll,log4net.dll;、修改web.config,装载Spring模块和处理程序,并指定配置上下文路径,装载日志系统: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. param name=ConversionPattern value=%d %t %-5p %c %x - %m%n/36. 37. 38. 39. 40. 41. 42. 43. 44.45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 复制代码添一个全局配置Global.asax,在启动时开启日志记录: 1. void Application_Start(object sender, EventArgs e) 2. 3. / log4net4. log4net.Config.DOMConfigurator.Configure();5. 复制代码run一下这个test.aspx,它会输出控制器名称Artist,平平无奇,却是与一种方式的告别Craig Walls们在Action in Spring的序中这样写道:开发者有一种宝贵的品质,那就是“懒惰”。这种懒惰激励开者努力用最小的开销找到最佳的解决方案。其实,有时不需要那么勤劳的,有些东西用成熟的框架能很好的解决,何必自己造轮子呢?当然,我并不是来搞推销的,只是由衷的喜欢spring,仅此而已。至于web service页.asmx的注入,将会在以后交待,或者有兴趣也可以参看一下这个不错的中文文档:附件: SpringNet_document.rar 也可以常上官网看看:/抑或与同好们交流:/企业级架构实战之3业务对象建模及codesmith模板 在软件开发的需求调研完成时,应着手设计业务对象模型。模型应恰到好处地容纳业务对系统的需求不冗余致拖累系统,不残缺致无法满足业务,因此,建模忠实地反映了调研工作的成效。建模的工具软件有很多,如Rational、Visual Case、UModel,不过本人基本上习惯了PowerDesigner:功能适用,各种模型能自由转化,具有不错的正反向数据库工程能力,还能良好地支持C#。OK,来建一个数据模型(用于ORM):1、PowerDesigner数据库建模PowerDesigner版本为12.0,“新建”一个“Physical Data Model”(物理数据模型),在其中构建一张“Table”(表)。此处的TB_ARTIST代表的是容纳艺人对象的表;附件: go1.jpg 需要将它在数据库中生成,可以在PowerDesigner中完成这步操作。点选“DataBase”下的“Connect”(Ctrl+Shit+N),将开始连接数据库:附件: go2.jpg 如果(Machine data source)数据源中不存在需要的数据库连接,可点击“Add“按钮,添加一个ODBC连接,操作很简单,此处不累述;连接上数据库后,选中要生成的表对象,选取“Database”菜单下的“Genernate Database”项,生成描述表结构的sql脚本文件:附件: go3.jpg 此处可以选择“Generation type”(生成类型),是只生成脚本,还是通过ODBC连接直接生成表。流程大同小异,选择“ODBC Generation“,一步到位:附件: go4.jpg 在生成操作前,会弹出“Excute SQL Query”对话框,提示确认即将运行的脚本内容,点击“Run”按钮,表就会生成好在数据库中。基本上,PowerDesigner
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学校洗漱台管理制度
- 学校网格化管理制度
- 学校陶艺社管理制度
- 学雷锋员工管理制度
- 安技处安全管理制度
- 安置点保洁管理制度
- 实训室使用管理制度
- 实验室活动管理制度
- 客服部内部管理制度
- 室内高尔夫管理制度
- 山东省威海市实验中学2025届七下英语期末达标检测试题含答案
- 2025年河北省中考麒麟卷地理(三)及答案
- 河南天一大联考2025年高二下学期期末学业质量监测英语试题
- 农药经营许可证培训考试题库及答案
- 财税法考试试题及答案
- 2025年青海省公务员录用考试《行测》真题及答案解析(记忆版)
- 2025入党考试试题及答案
- DB32/T 4593-2023研究型医院建设规范
- 基于轻量型CNN的无人机低空目标检测研究
- DB3415-T 82-2024 急流救援技术培训规范
- 智能制造系统-智能制造技术与未来
评论
0/150
提交评论