版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 HYPERLINK /kyo-yo/archive/2010/06/07/Study-Entlib5-First.html 微软企业库5.0 学习之路第一步、差不多入门一、什么是企业库? 企业库包含一系列应用程序模块和核心架构。这些高复用的组件旨在关心开发者解决一些共同的企业开发问题。 企业库同时提供高可配置的特性,使我们治理重复的工作更加容易,例如我们明白的在应用的专门多地点发生的横切关注点。包括像日志记录、缓存、异常治理等。另外,它提供的依靠注入容器能够简化和分解你的设计,使他们更加可实验和容易理解,关心你创建更加高性能的设计和各种应用。 二、使用企业库的3个简单步骤: 1.引用和配置你
2、需要的程序集。 2.通过企业库配置应用。 3.在你的代码中创建和使用企业库对象。 三、企业库的好处: 应用模块关心解决开发者从一个项目到另一个项目面对的共同问题。他们的设计封装了微软推举的做法,这些差不多上基于微软框架的应用开发。例如,数据访问应用模块提供了对ADO.NET访问最频繁使用的特征。在某些情况下,应用模块还添加了一些基础类库没有直接提供的相关功能。 四、企业库的目标: 1.一致。所有的企业库模块都坚持一致的设计模式和实现方式。 2.可扩展性。所有的应用模块包括定义扩展点,同意开发人员通过添加自己的代码定制应用模块的行为。 3.易用性。企业库提供了许多有用性的东西,包括一个图形化配置
3、工具,简单的安装过程,完成的文档和示例。 4.集成。企业库应用模块被设计得能够一起专门好的工作,同时也被如此测试过。然而你不必一起使用他们。我们能够单独使用这些应用模块,同时这些应用模块之间也有些依靠,比如在企业库核心和Unity中的一些通用组件。 上面是企业库的差不多概念,理解了企业库的相关知识后,我们能够开始来安装企业库了1、下载地址: HYPERLINK /releases/view/43135 t _blank 点我进入下载页面(不是直接下载),安装后就能够使用了。这次5.0相比4.1的最大改动确实是整个配置工具采纳了WPF重新构建和实例化和治理对象生命周期的全依靠注入的实现,同时支持
4、VS2008SP1和VS2010,话讲尽管这次的配置工具变化挺大的,然而一旦熟悉了就觉得比4.1的好,因为能够清晰的看见每个模块的之间的依靠关系。一、Unity和对象生成器的整合 在那个版本中,用于创建对象的差不多技术是一个单一的依靠注入容器,默认的是Unity。你能够使用容器生成企业库对象的实例并注入到其他的对象。 企业库提供一个标准的接口从Unity容器中来获得定义在企业库配置中的对象的实例,如SqlDatabase或LogWriter.另外,注入友好的实例门面处理静态门面之外是有效的,因为静态门面不能用注入,然而为了向后兼容往常的版本而存在。在本版本中的示例中差不多上用依靠注入,然而往常
5、版本中是用的静态工厂类和静态门面在那个版本中依旧支持的。对象生成器,一个低版本的依靠注入机制在那个版本中被归入Unity中,在项目中不再需要单独引用对象生成器集。 支持Unity容器,必须引用一个被包含在企业库中的Microsoft.Practices.ServiceLocation程序集。假如要使用一个第3方的依靠注入容器,必须直接实现IServiceLocator接口或者通过适配器实现。二、阻碍所有模块的变化: 1.在企业库中要紧修正是使用依靠注入机制。所用的应用模块以及核心系统差不多上用依靠注入机制,并使用Unity作为默认的依靠注入容器,来创建和治理企业库对象。 2.自主容器的实现通过
6、实现Common Service Locator项目提供的 IServiceLocator 接口来完成。 3.由于错误配置引发的错误将提供更多有用的错误信息。 4.配置系统公开了一个 fluent接口,用来为单个对象或整个应用创建和填充配置源。fluent API使得为各种情景创建配置源更加容易。 5.ConfigurationView类被删除. 6.一些配置元素有默认值,可能不同于往常版本的隐式默认值. 7.企业库现在同意你通过另一个配置文件合成一个混合配置文件. 8.能够可通过不同的配置文件读取不同的配置信息. 9.企业库不支持XAML扫瞄器应用程序(XBAP). 10.WmiEnable
7、d标志为了像前兼容仍然存在企业库中,然而在5.0中是被忽略的,而且今后会被删除. 11.改进式的安装同意你只安装部分应用模块及配置工具. 12.在往常版本中要做统一集成,必须添加核心企业库的扩展和每个模块的扩展。现在假如你只需要直接访问容器,那么只有核心扩展是必须的。单独模块将自动支持。 旧的功能为了保持像前兼容仍然保留,但差不多不起作用。 13.FileConfigurationSource.Save 的签名差不多改变,参数由3个变为2个。 14.快速入门不再包含在主安装程序中。 三、Breaking变化: 1.企业库现在抛出了一个配置错误ActivationException,之前是Sys
8、tem.Configuration.ConfigurationErrorsException。这包括试着解决没有配置信息错误的一个实例提供者。 2.往常版本在猎取应用模块错误时抛出BuildFailedException错误,现在关于所有的应用模块都抛出ActivationException 3 .之前的版本,在讲一个空源传到容器来调用容器的时候,会抛出ArgumentNullException,现在抛出NullReferenceException 4.ObjectBuilder2不再是一个单独的程序集,而是集成到了Unity集合中,在项目中也不需要引用ObjectBuilder2.dll。
9、5.WMI支持差不多从企业库中删除,除了在logging模块中的WMI跟踪监听器。 6.假如你没有关闭DbDataReader,可能会导致随机的、专门难在您的代码中找到的错误,尤其是当你正在一个由TransactionScope上下文创建的隐式事务下操作时。 你必须始终确保您的应用程序及时关闭DbDataReader,不管是明确的DbDataReader.Close方法关闭或是逼迫DbDataReader释放。 7.假如你使用 validator 特性必须引用 System.ComponentModel.DataAnnotations程序集。 8.为FileConfigurationSourc
10、e.Save方法签名已更改。该方法有两个参数,而不是3个参数 9.Microsoft.Practices.EnterpriseLibrary.Configuration.Design.dll集合的功能和其他设计时集合被一个新的集合Microsoft.Practices.EnterpriseLibrary.Configuration.DesignTime.dll代替。 10,性能计数器异常从PolicyInjection.CallHandlers移到 PolicyInjection 程序集。 11.包含在Policy Injection Application Block中的CachingCal
11、lHandler有未处理的安全漏洞,差不多从Policy Injection Application Block中移除。 四、配置工具的改变: 1.新的企业拥有一个新的GUI库和一个元数据驱动的可扩展性模。 2.支持向导 3.新的类型选择。 4.不支持对依靠策略的Environmental Overrides 。日志模块处理Categories。 五、缓存模块变化: 1.缓存清除已被完全重写的性能优化 六、数据库访问模块: 1.ExecuteReader, ExecuteXmlReader, ExecuteScalar, and ExecuteNonQuery方法具有异步版本。 2.包含了专门
12、多新的方法和类同意你提取数据作为对象序列。例如在合适的时候使用客户端查询技术,如LINQ. 3.存在的方法ExecuteReader和新的方法BeginExecuteReader不接收CommandBehavior 参数。默认的当调用这些方法的时候这些方法 会自动设置CommandBehavior 属性到reder中用来关闭连接直到指定一个事务。 七、异常处理模块: 1.日志异常处理重新使用日志模块的Log Writer and Trace Listeners 。这在之前版本中不是默认设置。 2.增加一个功能,通过ExceptionManager.Process 方法接收一个默认值并返回一个值
13、。 HYPERLINK /kyo-yo/archive/2010/06/10/Learning-EntLib-Second.html EntLib微软企业库5.0 学习之路第二步、使用VS2010+Data Access模块建立多数据库项目现在我就开始进入学习之路的第二步Data Access模块,那个模块是企业库中被使用频率最高的模块,它专门好的封装了数据库操作应用,为我们进行多数据库系统开发提供了便利,只需更改配置文件就能够专门快的切换数据库访问(惋惜依旧要重写SQL语句,没法和ORM比)。下面是我在配置企业库的时候碰到问题,假如没有碰到能够略去不看(可能有点小白)注意:此处切换数据库配置
14、必须是计算机中差不多安装好相应的数据库访问模块,如需要进行从MS SQL向SQLite数据库的变更时,计算机中必须安装好SQLite数据库访问模块(在那个地点我就碰到了那个问题,原来我机器上在VS2008开发时差不多安装过SQLite数据库访问模块,然而新装了VS2010,在VS2010引用对话框中也能访问到在VS2008安装的SQLite(然而在企业库5.0配置器中无法查看到SQLite),然而发觉更改企业库的配置文件后无法访问SQLite数据库,尝试了专门多方法都没用,结果死马当活马医又重新装了一遍SQLite数据库访问模块再重新打开企业库配置器就能够看到SQLite数据库了(因此请确保在
15、企业库编辑器中能够查看到要切换的数据库,否则可能导致无法访问数据库)。看下图: 回归正题,这次的学习由于VS2010公布了,而且企业库5.0也都支持.NET4.0,因此决定企业库的学习之路采纳VS2010进行学习(顺便熟悉下.NET4的特性,怎么讲公司的项目不可能立马转移到.NET4.0的,现在就当练手吧)好了,现在就开始进行第2步的学习了,首先看下项目的结构:项目采纳仿MS PetShop架构,如不了解此架构能够到此查看了解: HYPERLINK /wayfarer/archive/2006/04/14/375382.html t _blank PetShop的系统架构设计其中DAL和DAL
16、SQLite层对应MS SQL和SQLite数据库,Helper为整个项目的关心器现在来具体了解下DAL层在DAL层中引用了Helper,IDAL,EnterpriseLibrary.Common和EnterpriseLibrary.Data这4个项目,其中Helper项目中有个DBHelper.cs,用于猎取当前的数据对象,其代码如下(采纳了C#4.0的语法特性,默认参数,数据库对象名默认为空,如此则会调用企业库默认的数据库对象,同时也能够在调用的时候赋值,如此则依照传递过来的数据库对象名来创建数据库,通过那个参数我们将原来需要重载的2个方法才能实现合并成了一个方法): HYPERLINK
17、/kyo-yo/archive/2010/06/10/Learning-EntLib-Second.html l viewSource o view source view source HYPERLINK /kyo-yo/archive/2010/06/10/Learning-EntLib-Second.html l printSource o print print HYPERLINK /kyo-yo/archive/2010/06/10/Learning-EntLib-Second.html l about o ? ?01using Microsoft.Practices.Enterpr
18、iseLibrary.Common.Configuration;02using Microsoft.Practices.EnterpriseLibrary.Data;0304namespace EntLibStudy.Helper0506public static class DBHelper0708/ 09/ 猎取数据库对象10/ 11/ 数据库实例名(默认name为空,调用默认数据库实例)12/ 数据库对象13public static Database CreateDataBase(string name = )1415/return DatabaseFactory.CreateData
19、base(name);16return EnterpriseLibraryContainer.Current.GetInstance(name);171819在DAL层中则引用Helper来猎取数据库对象,进行数据库操作,我们现在来看下具体的数据库访问类编写代码,学员操作类: HYPERLINK /kyo-yo/archive/2010/06/10/Learning-EntLib-Second.html l viewSource o view source view source HYPERLINK /kyo-yo/archive/2010/06/10/Learning-EntLib-Seco
20、nd.html l printSource o print print HYPERLINK /kyo-yo/archive/2010/06/10/Learning-EntLib-Second.html l about o ? ?001using System;002using System.Collections.Generic;003using System.Data;004using System.Data.Common;005using System.Linq;006using System.Text;007008using Microsoft.Practices.EnterpriseL
21、ibrary.Data;009010using EntLibStudy.Model;011using EntLibStudy.Helper;012013namespace EntLibStudy.DAL014015public class StudentService : EntLibStudy.IDAL.IStudentService016017/ 018/ 新增学生019/ 020/ 学生对象021/ 022public int Add(Student student)023024Database db = DBHelper.CreateDataBase();025StringBuilde
22、r sb = new StringBuilder();026sb.Append(insert into Student values(ClassId,SID,Password,Name,Sex,Birthday,IsAdmin);SELECT IDENTITY;);027DbCommand cmd = db.GetSqlStringCommand(sb.ToString();028db.AddInParameter(cmd, ClassId, DbType.String, student.ClassId);029db.AddInParameter(cmd, SID, DbType.String
23、, student.Sid);030db.AddInParameter(cmd, Password, DbType.String, student.Password);031db.AddInParameter(cmd, Name, DbType.String, student.Name);032db.AddInParameter(cmd, Sex, DbType.Int32, student.Sex);033db.AddInParameter(cmd, Birthday, DbType.DateTime, student.Birthday);034db.AddInParameter(cmd,
24、IsAdmin, DbType.Int32, student.IsAdmin);035int id = Convert.ToInt32(db.ExecuteScalar(cmd);036return id;037038039/ 040/ 更新041/ 042/ 学生对象043/ 是否成功044public bool Update(Student student)045046Database db = DBHelper.CreateDataBase();047StringBuilder sb = new StringBuilder();048sb.Append(update Student se
25、t ClassId=ClassId,);049sb.Append(SID=SID,);050sb.Append(Password=Password,);051sb.Append(Name=Name,);052sb.Append(Sex=Sex,);053sb.Append(Birthday=Birthday,);054sb.Append(IsAdmin=IsAdmin );055sb.Append( where ID=ID);056DbCommand cmd = db.GetSqlStringCommand(sb.ToString();057db.AddInParameter(cmd, Cla
26、ssId, DbType.String, student.ClassId);058db.AddInParameter(cmd, SID, DbType.String, student.Sid);059db.AddInParameter(cmd, Password, DbType.String, student.Password);060db.AddInParameter(cmd, Name, DbType.String, student.Name);061db.AddInParameter(cmd, Sex, DbType.Int32, student.Sex);062db.AddInPara
27、meter(cmd, Birthday, DbType.DateTime, student.Birthday);063db.AddInParameter(cmd, IsAdmin, DbType.Int32, student.IsAdmin);064db.AddInParameter(cmd, ID, DbType.Int32, student.Id);065return db.ExecuteNonQuery(cmd) 0 ? true : false;066067068/ 069/ 删除070/ 071/ 学生ID072/ 是否成功073public bool Delete(int id)0
28、74075Database db = DBHelper.CreateDataBase();076StringBuilder sb = new StringBuilder();077sb.Append(delete from Student );078sb.Append( where ID=ID);079DbCommand cmd = db.GetSqlStringCommand(sb.ToString();080db.AddInParameter(cmd, ID, DbType.Int32, id);081082return db.ExecuteNonQuery(cmd) 0 ? true :
29、 false;083084085/ 086/ 依照学生ID查询学生对象087/ 088/ 学生ID089/ 090public Student SelectById(int id)091092Student student = null;093Database db = DBHelper.CreateDataBase();094StringBuilder sb = new StringBuilder();095sb.Append(select * from Student );096sb.Append( where ID=ID);097DbCommand cmd = db.GetSqlStri
30、ngCommand(sb.ToString();098db.AddInParameter(cmd, ID, DbType.Int32, id);099100using (IDataReader reader = db.ExecuteReader(cmd)101102if (reader.Read()103104student = new Student()105106Id = reader.GetInt32(0),107ClassId = reader.GetInt32(1),108Sid = reader.GetString(2),109Password = reader.GetString
31、(3),110Name = reader.GetString(4),111Sex = reader.GetInt32(5),112Birthday = reader.GetDateTime(6),113IsAdmin = reader.GetInt32(7)114;115116117118return student;119120121/ 122/ 查询所有学生信息123/ 124/ 125public IList SelectAll()126127List list = new List();128Database db = DBHelper.CreateDataBase();129Stri
32、ngBuilder sb = new StringBuilder();130sb.Append(select * from Student );131DbCommand cmd = db.GetSqlStringCommand(sb.ToString();132133using (IDataReader reader = db.ExecuteReader(cmd)134135while (reader.Read()136137list.Add(new Student()138139Id = reader.GetInt32(0),140ClassId = reader.GetInt32(1),1
33、41Sid = reader.GetString(2),142Password = reader.GetString(3),143Name = reader.GetString(4),144Sex = reader.GetInt32(5),145Birthday = reader.GetDateTime(6),146IsAdmin = reader.GetInt32(7)147);148149150return list;151152153/ 154/ 查询所有学生信息155/ 156/ 157public IList SelectAllMapper()158159var list = new
34、 List();160Database db = DBHelper.CreateDataBase();161DataAccessor studentAccessor;162/studentAccessor = db.CreateSqlStringAccessor(select * from Student,163/ MapBuilder.MapAllProperties().164/ Build()165/ );166studentAccessor = db.CreateSqlStringAccessor(select * from Student,167MapBuilder.MapAllPr
35、operties().168Map(p = p.Id).ToColumn(ID).169Map(p = p.Sid).ToColumn(SID).170Map(p = p.Password).WithFunc(f = *)./将密码转换为*,无法直接查看171Map(p = p.Name).WithFunc(ToUpperName)./将学员名称转换为大写172Map(p = p.Sex).ToColumn(Sex).173Map(p = p.Birthday).ToColumn(Birthday).174Build()175);176list = studentAccessor.Execut
36、e().ToList();177return list;178179180/ 181/ 将学员名称转换为大写182/ 183/ 184/ 185private string ToUpperName(IDataRecord dataRecord)186187var name = (string)dataRecordName;188return name.ToUpper();189190191public Student SelectBySid(string sid)192193Student student = null;194Database db = DBHelper.CreateDataB
37、ase();195StringBuilder sb = new StringBuilder();196sb.Append(select * from Student );197sb.Append( where SID=SID);198DbCommand cmd = db.GetSqlStringCommand(sb.ToString();199db.AddInParameter(cmd, SID, DbType.String, sid);200201using (IDataReader reader = db.ExecuteReader(cmd)202203if (reader.Read()2
38、04205student = new Student()206207Id = reader.GetInt32(0),208ClassId = reader.GetInt32(1),209Sid = reader.GetString(2),210Password = reader.GetString(3),211Name = reader.GetString(4),212Sex = reader.GetInt32(5),213Birthday = reader.GetDateTime(6),214IsAdmin = reader.GetInt32(7)215;216217218219return
39、 student;220221222223其中的代码差不多上采纳了比较常见的老套路:1、猎取数据库对象2、构建Command对象并进行执行语句及参数赋值3、通过数据库对象调用相应方法执行Command企业库在Data Access上帮我们做了比较好的封装,相当于为我们提供了如SQLHelper,OracleHelper类,只只是那个关心类转换了一个个数据库的对象,通过数据库对象来对数据库数据进行操作(个人认为通过这种方式进行操作更加直观,而且企业库的对SQL语句的参数操作方法也专门直观:AddInParameter,AddOutParameter,GetParameterValue专门好的区分
40、了参数的操作,比原来的SQLCommand好多了)假如认真看了上面操作代码的朋友确信发觉了类中有个叫SelectAllMapper的方法,那个方法采纳的是企业库5.0中新提供的Accessor进行RowMapper来直接为实体赋值,相比原来的使用reader方式取值赋值更加优雅,只要SQL查询出来的对象字段和实体对象属性一样就能够使用MapAllProperties()方法直接赋值,假如不同的话能够使用map方法来对个不属性单独映射,而且在映射的时候还能够使用WithFunc来进行进一步操作,在代码中我将密码进行了替换,以“*”的形式展示,同时把学员的名称以大写的形式展示。(注:更多的企业库Data Access模块方法使用能够点击 HYPERLINK /kyo-yo/archive/2010/06/07/Study-Entlib5-First.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年主管护师考试考题及答案
- 2026年银行业专业人员中级职业资格考试(专业实务风险管理)测试题及答案
- 2026年碳排放核算员职业理论考试题库及答案
- 2026年秋招国企笔试题库及答案
- 2026年京东POP店铺初级售后客服认证考试题库答案
- 2026年国企薪酬绩效面试题目及核心答案
- 2026年度烟台市市级机关公开遴选公务员笔试备考试题及答案详解
- 2026京东自营售前初级客服认证考试及答案
- 智能家居宣传资料
- 升级加薪申请书
- 湖北省十堰市2025-2026学年高一下学期期末考试生物试卷
- 期末综合测试卷二(试卷)2025-2026学年五年级语文下册统编版(含答案)
- 期末模拟考试(一)-2025-2026学年高二下学期人教A版数学(含解析)
- 香港公司收购及合并守则
- 2026南方凯能(广东)电力集团有限公司校园招聘备考题库及一套答案详解
- 2026年全国保密教育线上培训考试试题及完整附答案
- 中国血脂管理指南课件
- 2026年高考高校招收华侨港澳台生化学试卷试题(含答案详解)
- (2026版)《包头市市政设施管理条例》解读与实施
- 23.4 实际问题与一次函数(第1课时)教学设计
- 含铁尘泥水洗脱氯及蒸发提盐技术规范
评论
0/150
提交评论