收藏 分销(赏)

微软企业库学习手册模板.docx

上传人:精**** 文档编号:2957495 上传时间:2024-06-12 格式:DOCX 页数:20 大小:167.28KB 下载积分:10 金币
下载 相关 举报
微软企业库学习手册模板.docx_第1页
第1页 / 共20页
微软企业库学习手册模板.docx_第2页
第2页 / 共20页


点击查看更多>>
资源描述
微软企业库5.0 学习之路——第一步、基础入门 一、什么是企业库? 企业库包含一系列应用程序模块和关键架构。这些高复用组件意在帮助开发者处理部分共同企业开发问题。 企业库同时提供高可配置特征,使我们管理反复工作愈加轻易,比如我们知道在应用很多地方发生横切关注点。包含像日志统计、缓存、异常管理等。另外,它提供依靠注入容器能够简化和分解你设计,使她们愈加可试验和轻易了解,帮助你创建愈加高性能设计和多种应用。 二、使用企业库3个简单步骤: 1.引用和配置你需要程序集。 2.经过企业库配置应用。 3.在你代码中创建和使用企业库对象。 三、企业库好处: 应用模块帮助处理开发者从一个项目到另一个项目面正确共同问题。她们设计封装了微软推荐做法,这些全部是基于微软框架应用开发。比如,数据访问应用模块提供了对ADO.NET访问最频繁使用特征。在一些情况下,应用模块还添加了部分基础类库没有直接提供相关功效。 四、企业库目标: 1.一致。全部企业库模块全部坚持一致设计模式和实现方法。 2.可扩展性。全部应用模块包含定义扩展点,许可开发人员经过添加自己代码定制应用模块行为。 3.易用性。企业库提供了很多实用性东西,包含一个图形化配置工具,简单安装过程,完成文档和示例。 4.集成。企业库应用模块被设计得能够一起很好工作,而且也被这么测试过。不过你无须一起使用她们。我们能够单独使用这些应用模块,同时这些应用模块之间也有些依靠,比如在企业库关键和Unity中部分通用组件。 上面是企业库基础概念,了解了企业库相关知识后,我们能够开始来安装企业库了 1、下载地址:点我进入下载页面(不是直接下载),安装后就能够使用了。 这次5.0相比4.1最大改动就是整个配置工具采取了WPF重新构建和实例化和管理对象生命周期全依靠注入实现,同时支持VSSP1和VS,话说即使这次配置工具改变挺大,不过一旦熟悉了就认为比4.1好,因为能够清楚看见每个模块之间依靠关系。 一、Unity和对象生成器整合 在这个版本中,用于创建对象基础技术是一个单一依靠注入容器,默认是Unity。你能够使用容器生成企业库对象实例并注入到其它对象。 企业库提供一个标准接口从Unity容器中来取得定义在企业库配置中对象实例,如SqlDatabase或LogWriter.另外,注入友好实例门面处理静态门面之外是有效,因为静态门面不能用注入,不过为了向后兼容以前版本而存在。在本版本中示例中全部是用依靠注入,不过以前版本中是用静态工厂类和静态门面在这个版本中还是支持。对象生成器,一个低版本依靠注入机制在这个版本中被归入Unity中,在项目中不再需要单独引用对象生成器集。 支持Unity容器,必需引用一个被包含在企业库中Microsoft.Practices.ServiceLocation程序集。假如要使用一个第3方依靠注入容器,必需直接实现IServiceLocator接口或经过适配器实现。 二、影响全部模块改变: 1.在企业库中关键修正是使用依靠注入机制。所用应用模块和关键系统全部是用依靠注入机制,并使用Unity作为默认依靠注入容器,来创建和管理企业库对象。 2.自主容器实现经过实现Common Service Locator项目提供 IServiceLocator 接口来完成。 3.因为错误配置引发错误将提供更多有用错误信息。 4.配置系统公开了一个 fluent接口,用来为单个对象或整个应用创建和填充配置源。fluent API使得为多种情景创建配置源愈加轻易。 5.ConfigurationView类被删除. 6.部分配置元素有默认值,可能不一样于以前版本隐式默认值. 7.企业库现在许可你经过另一个配置文件合成一个混合配置文件. 8.能够可经过不一样配置文件读取不一样配置信息. 9.企业库不支持XAML浏览器应用程序(XBAP). 10.WmiEnabled标志为了像前兼容仍然存在企业库中,不过在5.0中是被忽略,而且未来会被删除. 11.改善式安装许可你只安装部分应用模块及配置工具. 12.在以前版本中要做统一集成,必需添加关键企业库扩展和每个模块扩展。现在假如你只需要直接访问容器,那么只相关键扩展是必需。单独模块将自动支持。 旧功效为了保持像前兼容仍然保留,但已经不起作用。 13.FileConfigurationSource.Save 署名已经改变,参数由3个变为2个。 14.快速入门不再包含在主安装程序中。 三、Breaking改变: 1.企业库现在抛出了一个配置错误ActivationException,之前是System.Configuration.ConfigurationErrorsException。这包含试着处理没有配置信息错误一个实例提供者。 2.以前版本在获取应用模块错误时抛出BuildFailedException错误,现在对于全部应用模块全部抛出ActivationException 3 .之前版本,在讲一个空源传到容器来调用容器时候,会抛出ArgumentNullException,现在抛出NullReferenceException 4.ObjectBuilder2不再是一个单独程序集,而是集成到了Unity集合中,在项目中也不需要引用ObjectBuilder2.dll。 5.WMI支持已经从企业库中删除,除了在logging模块中WMI跟踪监听器。 6.假如你没相关闭DbDataReader,可能会造成随机、极难在您代码中找到错误,尤其是当你正在一个由TransactionScope上下文创建隐式事务下操作时。 你必需一直确保您应用程序立即关闭DbDataReader,不管是明确DbDataReader.Close方法关闭或是强迫DbDataReader释放。 7.假如你使用 validator 特征必需引用 System.ComponentModel.DataAnnotations程序集。 8.为FileConfigurationSource.Save方法署名已更改。该方法有两个参数,而不是3个参数 9.Microsoft.Practices.EnterpriseLibrary.Configuration.Design.dll集合功效和其它设计时集合被一个新集合Microsoft.Practices.EnterpriseLibrary.Configuration.DesignTime.dll替换。 10,性能计数器异常从PolicyInjection.CallHandlers移到 PolicyInjection 程序集。 11.包含在Policy Injection Application Block中CachingCallHandler有未处理安全漏洞,已经从Policy Injection Application Block中移除。 四、配置工具改变: 1.新企业拥有一个新GUI库和一个元数据驱动可扩展性模。 2.支持向导 3.新类型选择。 4.不支持对依靠策略Environmental Overrides 。日志模块处理Categories。 五、缓存模块改变: 1.缓存清除已被完全重写性能优化 六、数据库访问模块: 1.ExecuteReader, ExecuteXmlReader, ExecuteScalar, and ExecuteNonQuery方法含有异步版本。 2.包含了很多新方法和类许可你提取数据作为对象序列。比如在适宜时候使用用户端查询技术,如LINQ. 3.存在方法ExecuteReader和新方法BeginExecuteReader不接收CommandBehavior 参数。默认当调用这些方法时候这些方法 会自动设置CommandBehavior 属性到reder中用来关闭连接直到指定一个事务。 七、异常处理模块: 1.日志异常处理重新使用日志模块Log Writer and Trace Listeners 。这在之前版本中不是默认设置。 2.增加一个功效,经过ExceptionManager.Process 方法接收一个默认值并返回一个值。 [EntLib]微软企业库5.0 学习之路——第二步、使用VS+Data Access模块建立多数据库项目 现在我就开始进入学习之路第二步——Data Access模块,这个模块是企业库中被使用频率最高模块,它很好封装了数据库操作应用,为我们进行多数据库系统开发提供了便利,只需更改配置文件就能够很快切换数据库访问(可惜还是要重写SQL语句,没法和ORM比)。 下面是我在配置企业库时候碰到问题,假如没有碰到能够略去不看(可能有点小白) 注意:此处切换数据库配置必需是计算机中已经安装好对应数据库访问模块,如需要进行从MS SQL向SQLite数据库变更时,计算机中必需安装好SQLite数据库访问模块(在这里我就碰到了这个问题,原来我机器上在VS开发时已经安装过SQLite数据库访问模块,不过新装了VS,在VS引用对话框中也能访问到在VS安装SQLite(不过在企业库5.0配置器中无法查看到SQLite),不过发觉更改企业库配置文件后无法访问SQLite数据库,尝试了很多方法全部没用,结果死马当活马医又重新装了一遍SQLite数据库访问模块再重新打开企业库配置器就能够看到SQLite数据库了(所以请确保在企业库编辑器中能够查看到要切换数据库,不然可能造成无法访问数据库)。看下图: 回归正题,这次学习因为VS公布了,而且企业库5.0也全部支持.NET4.0,所以决定企业库学习之路采取VS进行学习(顺便熟悉下.NET4特征,毕竟企业项目不可能立马转移到.NET4.0,现在就当练手吧) 好了,现在就开始进行第2步学习了,首先看下项目标结构: 项目采取仿MS PetShop架构,如不了解此架构能够到此查看了解:PetShop系统架构设计 其中DAL和DALSQLite层对应MS SQL和SQLite数据库,Helper为整个项目标帮助器 现在来具体了解下DAL层 在DAL层中引用了Helper,IDAL,EnterpriseLibrary.Common和EnterpriseLibrary.Data这4个项目,其中Helper项目中有个DBHelper.cs,用于获取目前数据对象,其代码以下(采取了C#4.0语法特征,默认参数,数据库对象名默认为空,这么则会调用企业库默认数据库对象,同时也能够在调用时候赋值,这么则依据传输过来数据库对象名来创建数据库,经过这个参数我们将原来需要重载2个方法才能实现合并成了一个方法): view sourceprint? 01 using Microsoft.Practices.EnterpriseLibrary.Common.Configuration; 02 using Microsoft.Practices.EnterpriseLibrary.Data; 03 04 namespace EntLibStudy.Helper 05 { 06 public static class DBHelper 07 { 08 /// <summary> 09 /// 获取数据库对象 10 /// </summary> 11 /// <param name="name">数据库实例名(默认name为空,调用默认数据库实例)</param> 12 /// <returns>数据库对象</returns> 13 public static Database CreateDataBase(string name = "") 14 { 15 //return DatabaseFactory.CreateDatabase(name); 16 return EnterpriseLibraryContainer.Current.GetInstance<Database>(name); 17 } 18 } 19 } 在DAL层中则引用Helper来获取数据库对象,进行数据库操作,我们现在来看下具体数据库访问类编写代码,学员操作类: view sourceprint? 001 using System; 002 using System.Collections.Generic; 003 using System.Data; 004 using System.Data.Common; 005 using System.Linq; 006 using System.Text; 007 008 using Microsoft.Practices.EnterpriseLibrary.Data; 009 010 using EntLibStudy.Model; 011 using EntLibStudy.Helper; 012 013 namespace EntLibStudy.DAL 014 { 015 public class StudentService : EntLibStudy.IDAL.IStudentService 016 { 017 /// <summary> 018 /// 新增学生 019 /// </summary> 020 /// <param name="student">学生对象</param> 021 /// <returns></returns> 022 public int Add(Student student) 023 { 024 Database db = DBHelper.CreateDataBase(); 025 StringBuilder sb = new StringBuilder(); 026 sb.Append("insert into Student values(@ClassId,@SID,@Password,@Name,@Sex,@Birthday,@IsAdmin);SELECT @@IDENTITY;"); 027 DbCommand cmd = db.GetSqlStringCommand(sb.ToString()); 028 db.AddInParameter(cmd, "@ClassId", DbType.String, student.ClassId); 029 db.AddInParameter(cmd, "@SID", DbType.String, student.Sid); 030 db.AddInParameter(cmd, "@Password", DbType.String, student.Password); 031 db.AddInParameter(cmd, "@Name", DbType.String, student.Name); 032 db.AddInParameter(cmd, "@Sex", DbType.Int32, student.Sex); 033 db.AddInParameter(cmd, "@Birthday", DbType.DateTime, student.Birthday); 034 db.AddInParameter(cmd, "@IsAdmin", DbType.Int32, student.IsAdmin); 035 int id = Convert.ToInt32(db.ExecuteScalar(cmd)); 036 return id; 037 } 038 039 /// <summary> 040 /// 更新 041 /// </summary> 042 /// <param name="classInfo">学生对象</param> 043 /// <returns>是否成功</returns> 044 public bool Update(Student student) 045 { 046 Database db = DBHelper.CreateDataBase(); 047 StringBuilder sb = new StringBuilder(); 048 sb.Append("update Student set ClassId=@ClassId,"); 049 sb.Append("SID=@SID,"); 050 sb.Append("Password=@Password,"); 051 sb.Append("Name=@Name,"); 052 sb.Append("Sex=@Sex,"); 053 sb.Append("Birthday=@Birthday,"); 054 sb.Append("IsAdmin=@IsAdmin "); 055 sb.Append(" where ID=@ID"); 056 DbCommand cmd = db.GetSqlStringCommand(sb.ToString()); 057 db.AddInParameter(cmd, "@ClassId", DbType.String, student.ClassId); 058 db.AddInParameter(cmd, "@SID", DbType.String, student.Sid); 059 db.AddInParameter(cmd, "@Password", DbType.String, student.Password); 060 db.AddInParameter(cmd, "@Name", DbType.String, student.Name); 061 db.AddInParameter(cmd, "@Sex", DbType.Int32, student.Sex); 062 db.AddInParameter(cmd, "@Birthday", DbType.DateTime, student.Birthday); 063 db.AddInParameter(cmd, "@IsAdmin", DbType.Int32, student.IsAdmin); 064 db.AddInParameter(cmd, "@ID", DbType.Int32, student.Id); 065 return db.ExecuteNonQuery(cmd) > 0 ? true : false; 066 } 067 068 /// <summary> 069 /// 删除 070 /// </summary> 071 /// <param name="id">学生ID</param> 072 /// <returns>是否成功</returns> 073 public bool Delete(int id) 074 { 075 Database db = DBHelper.CreateDataBase(); 076 StringBuilder sb = new StringBuilder(); 077 sb.Append("delete from Student "); 078 sb.Append(" where ID=@ID"); 079 DbCommand cmd = db.GetSqlStringCommand(sb.ToString()); 080 db.AddInParameter(cmd, "@ID", DbType.Int32, id); 081 082 return db.ExecuteNonQuery(cmd) > 0 ? true : false; 083 } 084 085 /// <summary> 086 /// 依据学生ID查询学生对象 087 /// </summary> 088 /// <param name="id">学生ID</param> 089 /// <returns></returns> 090 public Student SelectById(int id) 091 { 092 Student student = null; 093 Database db = DBHelper.CreateDataBase(); 094 StringBuilder sb = new StringBuilder(); 095 sb.Append("select * from Student "); 096 sb.Append(" where ID=@ID"); 097 DbCommand cmd = db.GetSqlStringCommand(sb.ToString()); 098 db.AddInParameter(cmd, "@ID", DbType.Int32, id); 099 100 using (IDataReader reader = db.ExecuteReader(cmd)) 101 { 102 if (reader.Read()) 103 { 104 student = new Student() 105 { 106 Id = reader.GetInt32(0), 107 ClassId = reader.GetInt32(1), 108 Sid = reader.GetString(2), 109 Password = reader.GetString(3), 110 Name = reader.GetString(4), 111 Sex = reader.GetInt32(5), 112 Birthday = reader.GetDateTime(6), 113 IsAdmin = reader.GetInt32(7) 114 }; 115 } 116 } 117 118 return student; 119 } 120 121 /// <summary> 122 /// 查询全部学生信息 123 /// </summary> 124 /// <returns></returns> 125 public IList<Student> SelectAll() 126 { 127 List<Student> list = new List<Student>(); 128 Database db = DBHelper.CreateDataBase(); 129 StringBuilder sb = new StringBuilder(); 130 sb.Append("select * from Student "); 131 DbCommand cmd = db.GetSqlStringCommand(sb.ToString()); 132 133 using (IDataReader reader = db.ExecuteReader(cmd)) 134 { 135 while (reader.Read()) 136 { 137 list.Add(new Student() 138 { 139 Id = reader.GetInt32(0), 140 ClassId = reader.GetInt32(1), 141 Sid = reader.GetString(2), 142 Password = reader.GetString(3), 143 Name = reader.GetString(4), 144 Sex = reader.GetInt32(5), 145 Birthday = reader.GetDateTime(6), 146 IsAdmin = reader.GetInt32(7) 147 }); 148 } 149 } 150 return list; 151 } 152 153 /// <summary> 154 /// 查询全部学生信息 155 /// </summary> 156 /// <returns></returns> 157 public IList<Student> SelectAllMapper() 158 { 159 var list = new List<Student>(); 160 Database db = DBHelper.CreateDataBase(); 161 DataAccessor<Student> studentAccessor; 162 //studentAccessor = db.CreateSqlStringAccessor("select * from Student", 163 // MapBuilder<Student>.MapAllProperties(). 164 // Build() 165 // ); 166 studentAccessor = db.CreateSqlStringAccessor("select * from Student", 167 MapBuilder<Student>.MapAllProperties(). 168 Map(p => p.Id).ToColumn("ID"). 169 Map(p => p.Sid).ToColumn("SID"). 170 Map(p => p.Password).WithFunc(f => "******").//将密码转换为"*",无法直接查看 171 Map(p => p.Name).WithFunc(ToUpperName).//将学员名称转换为大写 172 Map(p => p.Sex).ToColumn("Sex"). 173 Map(p => p.Birthday).ToColumn("Birthday"). 174 Build() 175 ); 176 list = studentAccessor.Execute().ToList(); 177 return list; 178 } 179 180 /// <summary> 181 /// 将学员名称转换为大写 182 /// </summary> 183 /// <param name="dataRecord"></param> 184 /// <returns></returns> 185 private string ToUpperName(IDataRecord dataRecord) 186 { 187 var name = (string)dataRecord["Name"]; 188 return name.ToUpper(); 189 } 190 191 public Student SelectBySid(string sid) 192 { 193 Student student = null; 194 Database db = DBHelper.CreateDataBase(); 195 StringBuilder sb = new StringBuilder(); 196 sb.Append("select * from Student "); 197 sb.Append(" where SID=@SID"); 198 DbCommand cmd = db.GetSqlStringCommand(sb.ToString()); 199 db.AddInParameter(cmd, "@SID", DbType.String, sid); 200 201 using (IDataReader reader = db.ExecuteReader(cmd)) 202 { 203 if (reader.Read()) 204 { 205 student = new Student() 206 { 207 Id = reader.GetInt32(0), 208 ClassId = reader.GetInt32(1), 209 Sid = reader.GetString(2), 210 Password = reader.GetString(3), 211 Name = reader.GetString(4), 212 Sex = reader.GetInt32(5), 213 Birthday = reader.GetDateTime(6), 214 IsAdmin = reader.GetInt32(7) 215 }; 216 } 217 } 218 219 return student; 220 } 221 222 } 223 } 其中代码全部是采取了比较常见老套路: 1、获取数据库对象 2、构建Command对象并进行实施语句及参数赋值 3、经过数据库对象调用对应方法实施Command 企业库在Data Access上帮我们做了比很好封装,相当于为我们提供了如SQLHelper,OracleHelper类,只不过这个帮助类转换了一个个数据库对象,经过数据库对象来对数据库数据进行操作 (个人认为经过这种方法进行操作愈加直观,而且企业库对SQL语句参数操作方法也很直观:AddInParameter,AddOutParameter,GetParameterValue很好区分了参数操作,比原来SQLCommand好多了) 假如仔细看了上面操作代码好友肯定发觉了类中有个叫SelectAllMapper方法,这个方法采取是企业库5.0中新提供Accessor进行RowMapper来直接为实体赋值,相比原来使用reader方法取值赋值愈加优雅,只要SQL查询出来对象字段和实体对象属性一样就能够使用MapAllProperties()方法直接赋值,假如不一样话能够使用map方法来对部分属性单独映射,而且在映射时候还能够使用WithFunc来进行深入操作,在代码中我将密码进行了替换,以“*”形式展示,同时把学员名称以大写形式展示。 (注:更多企业库Data Access模块方法使用能够点击这里下载微软给出学习例子和公布学习手册) 在完成底层操作,现在我们就开始对企业库数据库访问进行配置: 在Web层Web.config上右键打开企业库配置器:Blocks-Add Data Settings-Add DataBase Connstring,新建2个数据库对象,一个是MS SqlServer数据库,一个是SQLite数据库. 新建一个数据库设置 新建二个数据库连接 一个为EntLibStudy,另一个为EntLibSQLite 我们来看下具体配置文件代码: view sourceprint? 01 <configuration> 02 <configSections> 03 <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" /> 04 </configSections> 05 06 <dataConfiguration defaultDatabase="EntLibStudy" /> 07 <connectionStrings> 08 <add name="EntLibStudy" connectionString="server=VOLK\SQL;database=EntLibStudy;Integrated Security=True;" 09 providerName="System.Data.SqlClient" /> 10 <add name="EntLibStudySQLite" connectionString="data source=|DataDirectory|EntLibStudySQLite.db3" 11 providerName="System.Data.SQLite" /> 12 </connectionStrings> 13 14 <appSettings> 15 <add key="DAL" value="EntLibStudy.DAL" /> 16 </appSettings> 17 18 <system.web> 19 <compilation debug="true" targetFramework="4.0" > 20 <expressionBuilders> 21 <add expressionPrefix="RouteUrl" type="System.Web.Compilation.RouteUrlExpressionBuilder"/> 22 <add expressionPrefix="RouteValue" type="System.Web.Compilation.RouteValueExpressionBuilder"/> 23 </expressionBuilders> 24 </compilation> 25 <authentication mode="Forms"> 26 </authentication> 27 28 </system.web> 29 30 </configuration> 至此我们就完成了Data Access模块代码编写和基础设置(具体代码请到文章底部下载源代码,类似代码则不再描述)。 这时假如项目需求发生了变更,因为成本太高不能使用MS SQL SERVER,而要改用SQLite数据库时则
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服