已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
微軟企業(yè)庫5.0 學(xué)習(xí)之路第一步、基本入門一、什么是企業(yè)庫? 企業(yè)庫包含一系列應(yīng)用程序模塊和核心架構(gòu)。這些高復(fù)用的組件旨在幫助開發(fā)者解決一些共同的企業(yè)開發(fā)問題。 企業(yè)庫同時提供高可配置的特性,使我們管理重復(fù)的工作更加容易,例如我們知道的在應(yīng)用的很多地方發(fā)生的橫切關(guān)注點。包括像日志記錄、緩存、異常管理等。另外,它提供的依賴注入容器能夠簡化和分解你的設(shè)計,使他們更加可實驗和容易理解,幫助你創(chuàng)建更加高性能的設(shè)計和各種應(yīng)用。 二、使用企業(yè)庫的3個簡單步驟: 1.引用和配置你需要的程序集。 2.通過企業(yè)庫配置應(yīng)用。 3.在你的代碼中創(chuàng)建和使用企業(yè)庫對象。 三、企業(yè)庫的好處: 應(yīng)用模塊幫助解決開發(fā)者從一個項目到另一個項目面對的共同問題。他們的設(shè)計封裝了微軟推薦的做法,這些都是基于微軟框架的應(yīng)用開發(fā)。例如,數(shù)據(jù)訪問應(yīng)用模塊提供了對ADO.NET訪問最頻繁使用的特征。在某些情況下,應(yīng)用模塊還添加了一些基礎(chǔ)類庫沒有直接提供的相關(guān)功能。 四、企業(yè)庫的目標: 1.一致。所有的企業(yè)庫模塊都堅持一致的設(shè)計模式和實現(xiàn)方式。 2.可擴展性。所有的應(yīng)用模塊包括定義擴展點,允許開發(fā)人員通過添加自己的代碼定制應(yīng)用模塊的行為。 3.易用性。企業(yè)庫提供了許多實用性的東西,包括一個圖形化配置工具,簡單的安裝過程,完成的文檔和示例。 4.集成。企業(yè)庫應(yīng)用模塊被設(shè)計得能夠一起很好的工作,并且也被這樣測試過。但是你不必一起使用他們。我們可以單獨使用這些應(yīng)用模塊,同時這些應(yīng)用模塊之間也有些依賴,比如在企業(yè)庫核心和Unity中的一些通用組件。 上面是企業(yè)庫的基本概念,理解了企業(yè)庫的相關(guān)知識后,我們可以開始來安裝企業(yè)庫了1、下載地址:點我進入下載頁面(不是直接下載),安裝后就可以使用了。這次5.0相比4.1的最大改動就是整個配置工具采用了WPF重新構(gòu)建和實例化和管理對象生命周期的全依賴注入的實現(xiàn),同時支持VS2008SP1和VS2010,話說雖然這次的配置工具變化挺大的,但是一旦熟悉了就覺得比4.1的好,因為可以清楚的看見每個模塊的之間的依賴關(guān)系。一、Unity和對象生成器的整合 在這個版本中,用于創(chuàng)建對象的基本技術(shù)是一個單一的依賴注入容器,默認的是Unity。你可以使用容器生成企業(yè)庫對象的實例并注入到其他的對象。 企業(yè)庫提供一個標準的接口從Unity容器中來獲得定義在企業(yè)庫配置中的對象的實例,如SqlDatabase或LogWriter.另外,注入友好的實例門面處理靜態(tài)門面之外是有效的,因為靜態(tài)門面不能用注入,但是為了向后兼容以前的版本而存在。在本版本中的示例中都是用依賴注入,但是以前版本中是用的靜態(tài)工廠類和靜態(tài)門面在這個版本中還是支持的。對象生成器,一個低版本的依賴注入機制在這個版本中被歸入Unity中,在項目中不再需要單獨引用對象生成器集。 支持Unity容器,必須引用一個被包含在企業(yè)庫中的Microsoft.Practices.ServiceLocation程序集。如果要使用一個第3方的依賴注入容器,必須直接實現(xiàn)IServiceLocator接口或者通過適配器實現(xiàn)。二、影響所有模塊的變化: 1.在企業(yè)庫中主要修正是使用依賴注入機制。所用的應(yīng)用模塊以及核心系統(tǒng)都是用依賴注入機制,并使用Unity作為默認的依賴注入容器,來創(chuàng)建和管理企業(yè)庫對象。 2.自主容器的實現(xiàn)通過實現(xiàn)Common Service Locator項目提供的 IServiceLocator 接口來完成。 3.由于錯誤配置引發(fā)的錯誤將提供更多有用的錯誤信息。 4.配置系統(tǒng)公開了一個 fluent接口,用來為單個對象或整個應(yīng)用創(chuàng)建和填充配置源。fluent API使得為各種情景創(chuàng)建配置源更加容易。 5.ConfigurationView類被刪除. 6.一些配置元素有默認值,可能不同于以前版本的隱式默認值. 7.企業(yè)庫現(xiàn)在允許你通過另一個配置文件合成一個混合配置文件. 8.可以可通過不同的配置文件讀取不同的配置信息. 9.企業(yè)庫不支持XAML瀏覽器應(yīng)用程序(XBAP). 10.WmiEnabled標志為了像前兼容仍然存在企業(yè)庫中,但是在5.0中是被忽略的,而且將來會被刪除. 11.改進式的安裝允許你只安裝部分應(yīng)用模塊及配置工具. 12.在以前版本中要做統(tǒng)一集成,必須添加核心企業(yè)庫的擴展和每個模塊的擴展?,F(xiàn)在如果你只需要直接訪問容器,那么只有核心擴展是必須的。單獨模塊將自動支持。 舊的功能為了保持像前兼容仍然保留,但已經(jīng)不起作用。 13.FileConfigurationSource.Save 的簽名已經(jīng)改變,參數(shù)由3個變?yōu)?個。 14.快速入門不再包含在主安裝程序中。 三、Breaking變化: 1.企業(yè)庫現(xiàn)在拋出了一個配置錯誤ActivationException,之前是System.Configuration.ConfigurationErrorsException。這包括試著解決沒有配置信息錯誤的一個實例提供者。 2.以前版本在獲取應(yīng)用模塊錯誤時拋出BuildFailedException錯誤,現(xiàn)在對于所有的應(yīng)用模塊都拋出ActivationException 3 .之前的版本,在講一個空源傳到容器來調(diào)用容器的時候,會拋出ArgumentNullException,現(xiàn)在拋出NullReferenceException 4.ObjectBuilder2不再是一個單獨的程序集,而是集成到了Unity集合中,在項目中也不需要引用ObjectBuilder2.dll。 5.WMI支持已經(jīng)從企業(yè)庫中刪除,除了在logging模塊中的WMI跟蹤監(jiān)聽器。 6.如果你沒有關(guān)閉DbDataReader,可能會導(dǎo)致隨機的、很難在您的代碼中找到的錯誤,尤其是當你正在一個由TransactionScope上下文創(chuàng)建的隱式事務(wù)下操作時。 你必須始終確保您的應(yīng)用程序及時關(guān)閉DbDataReader,無論是明確的DbDataReader.Close方法關(guān)閉或是逼迫DbDataReader釋放。 7.如果你使用 validator 特性必須引用 System.ComponentModel.DataAnnotations程序集。 8.為FileConfigurationSource.Save方法簽名已更改。該方法有兩個參數(shù),而不是3個參數(shù) 9.Microsoft.Practices.EnterpriseLibrary.Configuration.Design.dll集合的功能和其他設(shè)計時集合被一個新的集合Microsoft.Practices.EnterpriseLibrary.Configuration.DesignTime.dll代替。 10,性能計數(shù)器異常從PolicyInjection.CallHandlers移到 PolicyInjection 程序集。 11.包含在Policy Injection Application Block中的CachingCallHandler有未處理的安全漏洞,已經(jīng)從Policy Injection Application Block中移除。 四、配置工具的改變: 1.新的企業(yè)擁有一個新的GUI庫和一個元數(shù)據(jù)驅(qū)動的可擴展性模。 2.支持向?qū)?3.新的類型選擇。 4.不支持對依賴策略的Environmental Overrides 。日志模塊處理Categories。 五、緩存模塊變化: 1.緩存清除已被完全重寫的性能優(yōu)化 六、數(shù)據(jù)庫訪問模塊: 1.ExecuteReader, ExecuteXmlReader, ExecuteScalar, and ExecuteNonQuery方法具有異步版本。 2.包含了很多新的方法和類允許你提取數(shù)據(jù)作為對象序列。例如在合適的時候使用客戶端查詢技術(shù),如LINQ. 3.存在的方法ExecuteReader和新的方法BeginExecuteReader不接收CommandBehavior 參數(shù)。默認的當調(diào)用這些方法的時候這些方法 會自動設(shè)置CommandBehavior 屬性到reder中用來關(guān)閉連接直到指定一個事務(wù)。 七、異常處理模塊: 1.日志異常處理重新使用日志模塊的Log Writer and Trace Listeners 。這在之前版本中不是默認設(shè)置。 2.增加一個功能,通過ExceptionManager.Process 方法接收一個默認值并返回一個值。EntLib微軟企業(yè)庫5.0 學(xué)習(xí)之路第二步、使用VS2010+Data Access模塊建立多數(shù)據(jù)庫項目現(xiàn)在我就開始進入學(xué)習(xí)之路的第二步Data Access模塊,這個模塊是企業(yè)庫中被使用頻率最高的模塊,它很好的封裝了數(shù)據(jù)庫操作應(yīng)用,為我們進行多數(shù)據(jù)庫系統(tǒng)開發(fā)提供了便利,只需更改配置文件就可以很快的切換數(shù)據(jù)庫訪問(可惜還是要重寫SQL語句,沒法和ORM比)。下面是我在配置企業(yè)庫的時候碰到問題,如果沒有碰到可以略去不看(可能有點小白)注意:此處切換數(shù)據(jù)庫配置必須是計算機中已經(jīng)安裝好相應(yīng)的數(shù)據(jù)庫訪問模塊,如需要進行從MS SQL向SQLite數(shù)據(jù)庫的變更時,計算機中必須安裝好SQLite數(shù)據(jù)庫訪問模塊(在這里我就碰到了這個問題,原來我機器上在VS2008開發(fā)時已經(jīng)安裝過SQLite數(shù)據(jù)庫訪問模塊,但是新裝了VS2010,在VS2010引用對話框中也能訪問到在VS2008安裝的SQLite(但是在企業(yè)庫5.0配置器中無法查看到SQLite),但是發(fā)現(xiàn)更改企業(yè)庫的配置文件后無法訪問SQLite數(shù)據(jù)庫,嘗試了很多方法都沒用,結(jié)果死馬當活馬醫(yī)又重新裝了一遍SQLite數(shù)據(jù)庫訪問模塊再重新打開企業(yè)庫配置器就可以看到SQLite數(shù)據(jù)庫了(所以請確保在企業(yè)庫編輯器中可以查看到要切換的數(shù)據(jù)庫,否則可能導(dǎo)致無法訪問數(shù)據(jù)庫)。看下圖: 回歸正題,這次的學(xué)習(xí)由于VS2010發(fā)布了,而且企業(yè)庫5.0也都支持.NET4.0,所以決定企業(yè)庫的學(xué)習(xí)之路采用VS2010進行學(xué)習(xí)(順便熟悉下.NET4的特性,畢竟公司的項目不可能立馬轉(zhuǎn)移到.NET4.0的,現(xiàn)在就當練手吧)好了,現(xiàn)在就開始進行第2步的學(xué)習(xí)了,首先看下項目的結(jié)構(gòu):項目采用仿MS PetShop架構(gòu),如不了解此架構(gòu)可以到此查看了解:PetShop的系統(tǒng)架構(gòu)設(shè)計其中DAL和DALSQLite層對應(yīng)MS SQL和SQLite數(shù)據(jù)庫,Helper為整個項目的幫助器現(xiàn)在來具體了解下DAL層在DAL層中引用了Helper,IDAL,EnterpriseLibrary.Common和EnterpriseLibrary.Data這4個項目,其中Helper項目中有個DBHelper.cs,用于獲取當前的數(shù)據(jù)對象,其代碼如下(采用了C#4.0的語法特性,默認參數(shù),數(shù)據(jù)庫對象名默認為空,這樣則會調(diào)用企業(yè)庫默認的數(shù)據(jù)庫對象,同時也可以在調(diào)用的時候賦值,這樣則根據(jù)傳遞過來的數(shù)據(jù)庫對象名來創(chuàng)建數(shù)據(jù)庫,通過這個參數(shù)我們將原來需要重載的2個方法才能實現(xiàn)合并成了一個方法):view sourceprint?01using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;02using Microsoft.Practices.EnterpriseLibrary.Data;0304namespace EntLibStudy.Helper0506public static class DBHelper0708/ 09/ 獲取數(shù)據(jù)庫對象10/ 11/ 數(shù)據(jù)庫實例名(默認name為空,調(diào)用默認數(shù)據(jù)庫實例)12/ 數(shù)據(jù)庫對象13public static Database CreateDataBase(string name = )1415/return DatabaseFactory.CreateDatabase(name);16return EnterpriseLibraryContainer.Current.GetInstance(name);171819在DAL層中則引用Helper來獲取數(shù)據(jù)庫對象,進行數(shù)據(jù)庫操作,我們現(xiàn)在來看下具體的數(shù)據(jù)庫訪問類編寫代碼,學(xué)員操作類:view sourceprint?001using System;002using System.Collections.Generic;003using System.Data;004using System.Data.Common;005using System.Linq;006using System.Text;007008using Microsoft.Practices.EnterpriseLibrary.Data;009010using EntLibStudy.Model;011using EntLibStudy.Helper;012013namespace EntLibStudy.DAL014015public class StudentService : EntLibStudy.IDAL.IStudentService016017/ 018/ 新增學(xué)生019/ 020/ 學(xué)生對象021/ 022public int Add(Student student)023024Database db = DBHelper.CreateDataBase();025StringBuilder 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, 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, IsAdmin, DbType.Int32, student.IsAdmin);035int id = Convert.ToInt32(db.ExecuteScalar(cmd);036return id;037038039/ 040/ 更新041/ 042/ 學(xué)生對象043/ 是否成功044public bool Update(Student student)045046Database db = DBHelper.CreateDataBase();047StringBuilder sb = new StringBuilder();048sb.Append(update Student set 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, ClassId, 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.AddInParameter(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/ 學(xué)生ID072/ 是否成功073public bool Delete(int id)074075Database 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 : false;083084085/ 086/ 根據(jù)學(xué)生ID查詢學(xué)生對象087/ 088/ 學(xué)生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.GetSqlStringCommand(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(3),110Name = reader.GetString(4),111Sex = reader.GetInt32(5),112Birthday = reader.GetDateTime(6),113IsAdmin = reader.GetInt32(7)114;115116117118return student;119120121/ 122/ 查詢所有學(xué)生信息123/ 124/ 125public IList SelectAll()126127List list = new List();128Database db = DBHelper.CreateDataBase();129StringBuilder 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),141Sid = 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/ 查詢所有學(xué)生信息155/ 156/ 157public IList SelectAllMapper()158159var list = new 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.MapAllProperties().168Map(p = p.Id).ToColumn(ID).169Map(p = p.Sid).ToColumn(SID).170Map(p = p.Password).WithFunc(f = *)./將密碼轉(zhuǎn)換為*,無法直接查看171Map(p = p.Name).WithFunc(ToUpperName)./將學(xué)員名稱轉(zhuǎn)換為大寫172Map(p = p.Sex).ToColumn(Sex).173Map(p = p.Birthday).ToColumn(Birthday).174Build()175);176list = studentAccessor.Execute().ToList();177return list;178179180/ 181/ 將學(xué)員名稱轉(zhuǎn)換為大寫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.CreateDataBase();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()204205student = 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 student;220221222223其中的代碼都是采用了比較常見的老套路:1、獲取數(shù)據(jù)庫對象2、構(gòu)建Command對象并進行執(zhí)行語句及參數(shù)賦值3、通過數(shù)據(jù)庫對象調(diào)用相應(yīng)方法執(zhí)行Command企業(yè)庫在Data Access上幫我們做了比較好的封裝,相當于為我們提供了如SQLHelper,OracleHelper類,只不過這個幫助類轉(zhuǎn)換了一個個數(shù)據(jù)庫的對象,通過數(shù)據(jù)庫對象來對數(shù)據(jù)庫數(shù)據(jù)進行操作(個人認為通過這種方式進行操作更加直觀,而且企業(yè)庫的對SQL語句的參數(shù)操作方法也很直觀:AddInParameter,AddOutParameter,GetParameterValue很好的區(qū)分了參數(shù)的操作,比原來的SQLCommand好多了)如果仔細看了上面操作代碼的朋友肯定發(fā)現(xiàn)了類中有個叫SelectAllMapper的方法,這個方法采用的是企業(yè)庫5.0中新提供的Accessor進行RowMapper來直接為實體
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個人消費信用貸款合同范本11篇
- 二零二五年度商業(yè)街區(qū)臨時房屋借用經(jīng)營合同3篇
- 二零二五山地旅游度假村租賃協(xié)議3篇
- 二零二五年度餐飲加盟店食品安全風(fēng)險評估合同3篇
- 2025年度個人二手房買賣合同(含家具家電及搬家及清潔服務(wù))
- 科技助力家庭教育老年人與子女的和諧互動
- 跨學(xué)科視角下的學(xué)生自主學(xué)習(xí)能力培養(yǎng)路徑分析
- 二零二五年度金融法律服務(wù)顧問合同2篇
- 二零二五年度地震監(jiān)測井建設(shè)施工合同3篇
- 煙臺2025年山東煙臺萊州市征兵結(jié)合事業(yè)單位招聘征集本科及以上學(xué)歷畢業(yè)生入伍筆試歷年參考題庫附帶答案詳解
- 大慶市2025屆高三年級第二次教學(xué)質(zhì)量檢測(二模)政治試卷(含答案)
- 《史記》上冊注音版
- 2018年湖北省武漢市中考數(shù)學(xué)試卷含解析
- 測繪工程產(chǎn)品價格表匯編
- 《腎臟的結(jié)構(gòu)和功能》課件
- 裝飾圖案設(shè)計-裝飾圖案的形式課件
- 護理學(xué)基礎(chǔ)教案導(dǎo)尿術(shù)catheterization
- ICU護理工作流程
- 天津市新版就業(yè)、勞動合同登記名冊
- 廣東版高中信息技術(shù)教案(全套)
- 各種焊工證件比較和釋義
評論
0/150
提交評論