日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

你真的了解Ioc与AOP 吗?(2)

發(fā)布時間:2023/12/13 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你真的了解Ioc与AOP 吗?(2) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

三、基于配置文件和Reflection的工廠模式

為了消除MainApp對其它組件的依賴性,我們引入工廠模式,并且根據(jù)配置文件指定的裝配規(guī)程,利用.net提供的反射技術(shù)完成對象的組裝工作。本部分代碼僅僅提供一種功能演示,如果實際應(yīng)用仍需進(jìn)一步完善(建議使用一些成型的Ioc框架,例如Spring.net或Castle等)。經(jīng)過改造后的系統(tǒng),組件間依賴關(guān)系如下圖:

可以看出這次實現(xiàn)了真正的“針對接口編程”。所有的組件只依賴于接口。MainApp所需的對象是由工廠根據(jù)配置文件動態(tài)創(chuàng)建并組裝起來的。當(dāng)系統(tǒng)需求發(fā)生變化時,只需要修改一下配置文件就可以了。而且MainApp、SayHello和HelloGenerator之間不存在任何的依賴關(guān)系,實現(xiàn)了松耦合。

這是如何實現(xiàn)的呢?我們首先要能夠解析配置文件中的信息,然后建立包含相關(guān)信息的對象。最后根據(jù)這些信息利用反射機(jī)制完成對象的創(chuàng)建。首先我們看一下配置文件所包含的內(nèi)容:

<?xml version="1.0" encoding="utf-8" ?> <configuration><configSections><sectionGroup name="IocInCSharp"><section name="objects" type="IocInCSharp.ConfigHandler, MainApp" /></sectionGroup></configSections><IocInCSharp><objects><object name="SayHello" assembly="SayHello.dll" typeName="IocInCSharp.SayHello"><property name="HelloGenerator" assembly="HelloGenerator.dll" typeName="IocInCSharp.CnHelloGenerator"></property></object></objects></IocInCSharp> </configuration>

從中我們可以看出,我們實現(xiàn)了一個IocInCSharp.ConfigHandler類,用來處理配置文件中 IocInCSharp\objects結(jié)點(diǎn)中的內(nèi)容。ConfigHandler類將根據(jù)該結(jié)點(diǎn)下的內(nèi)容處理并創(chuàng)建一ConfigInfo對象(關(guān)于 ConfigInfo、ObjectInfo以及PropertyInfo的代碼可自行查看源代碼,這里就不再贅述)。ConfigHandler類的代碼實現(xiàn)如下:

using System; using System.Configuration; using System.Xml; namespace IocInCSharp {public class ConfigHandler:IConfigurationSectionHandler{public object Create(object parent, object configContext, System.Xml.XmlNode section){ObjectInfo info;PropertyInfo propInfo;ConfigInfo cfgInfo = new ConfigInfo();foreach(XmlNode node in section.ChildNodes){info = new ObjectInfo();info.name = node.Attributes["name"].Value;info.assemblyName = node.Attributes["assembly"].Value;info.typeName = node.Attributes["typeName"].Value;foreach(XmlNode prop in node){propInfo = new PropertyInfo();propInfo.propertyName = prop.Attributes["name"].Value;propInfo.assemblyName = prop.Attributes["assembly"].Value;propInfo.typeName = prop.Attributes["typeName"].Value;info.properties.Add(propInfo);}cfgInfo.Objects.Add(info);}return cfgInfo;}} }

通過ConfigHandler的解析,我們最終得到一個ConfigInfo實例,Factory就是根據(jù)這個實例中所包含的配置信息,利用反射技術(shù)對所需對象生成并組裝的。SayHelloFactory的代碼如下:

using System; using System.IO; using System.Configuration; using System.Reflection; namespace IocInCSharp {public class SayHelloFactory{public static object Create(string name){Assembly assembly;object o = null;object p;string rootPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + Path.DirectorySeparatorChar;ConfigInfo cfgInfo = (ConfigInfo)ConfigurationSettings.GetConfig("IocInCSharp/objects"); ObjectInfo info = cfgInfo.FindByName(name);if(info != null){assembly = Assembly.LoadFile(rootPath + info.assemblyName);o = assembly.CreateInstance(info.typeName);Type t = o.GetType();for(int i=0; i<info.properties.Count; i++){ PropertyInfo prop = (PropertyInfo)info.properties[i];assembly = Assembly.LoadFile(rootPath + prop.assemblyName);p = assembly.CreateInstance(prop.typeName);t.InvokeMember(prop.propertyName, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty, null, o, new Object[] {p});}}return o;}} }

在上面這段代碼中,重點(diǎn)注意三條命令的使用方法:

assembly = Assembly.LoadFile(rootPath + prop.assemblyName); p = assembly.CreateInstance(prop.typeName); t.InvokeMember(prop.propertyName, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty, null, o, new Object[] {p});

Assembly.LoadFile()用于將外部文件裝載進(jìn)來;assembly.CreateInstance()根據(jù)裝載進(jìn)來的程序集創(chuàng)建一指定類型的對象;t.InvokeMember(prop.propertyName, ........BindingFlags.SetProperty, null, o, new Object[] {p})利用反射機(jī)制對創(chuàng)建出來的對象設(shè)置屬性值。

我們的Factory就是利用這種方式根據(jù)配置文件動態(tài)加載程序集,動態(tài)創(chuàng)建對象并設(shè)置屬性的。有了這個Factory,MainApp中的內(nèi)容就很簡單了:

using System; namespace IocInCSharp {public class MainApp{public static void Main(){ISayHello sayHello = (ISayHello)SayHelloFactory.Create("SayHello");if(sayHello != null)sayHello.SayHelloTo("zhenyulu");elseConsole.WriteLine("Got an Error!");}} }

現(xiàn)在,MainApp只依賴于接口,不再依賴于其它組件,實現(xiàn)了松耦合。在本例子中,大家可以嘗試將配置文件中的IocInCSharp.CnHelloGenerator更改為IocInCSharp.EnHelloGenerator,看看是否輸出內(nèi)容由中文變?yōu)榱擞⑽摹_@便是“注入”的效果。

從上面這個例子我們可以看出,通過自定義配置文件和.net中的Reflection技術(shù),我們自己就可以開發(fā)Ioc應(yīng)用,根據(jù)配置文件的信息自行組裝相應(yīng)的對象。但是Reflection編程的技術(shù)門檻還是比較高的,并且在實際應(yīng)用中配置文件的格式、Handler的設(shè)計都不是象上面代碼那樣的簡單。不過幸好我們現(xiàn)在有很多的Ioc容器可供選擇,它們都提供了完整的依賴注入方式,并且比自己寫代碼更加成熟、更加穩(wěn)定。使用這些框架可以讓程序員在三兩行代碼里完成“注入”工作。在我們下一個案例中,我們將使用Spring.net實現(xiàn)依賴注入。我們會發(fā)現(xiàn)僅僅添加幾行代碼并更改一下配置文件就可輕松實現(xiàn)依賴注入。(待續(xù))

轉(zhuǎn)載于:https://www.cnblogs.com/kevin-wang/archive/2010/04/29/1723459.html

總結(jié)

以上是生活随笔為你收集整理的你真的了解Ioc与AOP 吗?(2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 影音先锋丝袜制服 | 午夜一二三区 | 美女扒开腿让男生桶 | 性高潮久久久久久久久久 | 999热 | 在线视频中文字幕 | 2一3sex性hd | 久久99精品久久久久久三级 | 樱桃成人精品视频在线播放 | 丁香九月婷婷 | 韩国女同性做爰三级 | 亚洲色图丝袜美腿 | 亚洲精品视频久久久 | 国产黄色在线观看 | 欧美精品黑人猛交高潮 | 夜夜干天天操 | 国产欧美啪啪 | 亚洲成人7777 | 国产a视频精品免费观看 | www.sesehu| 国产精品高潮呻吟视频 | 麻豆视频精品 | 激情婷| 久久一区二区三 | 老司机久久精品视频 | 国产成人欧美一区二区三区91 | www久久久久久 | 黄色国产一级片 | 992tv在线影院| 国产免费一区视频观看免费 | 伊朗做爰xxxⅹ性视频 | 神马久久久久久久 | 男人天堂av电影 | 国产xxxxx | 欧美xxxx69| 国精产品一区一区三区有限公司杨 | 久久久成人免费 | 狠狠五月天 | 岛国av免费 | jizz18欧美18| 在线亚洲天堂 | 国产福利av | 少妇一级淫免费播放 | 亚洲精品一区三区三区在线观看 | 久久国产视频网 | 国产精品久久久久毛片大屁完整版 | 欧美成人一区二区三区高清 | 天天av天天操 | 国产在线观看免费视频软件 | 国产永久在线观看 | 日本在线播放 | 91大神久久 | 亚洲AV无码阿娇国产精品 | 伊人精品国产 | 欧美www视频 | 亚洲欧洲久久 | 欧美日本一区二区三区 | 岛国a视频| 国产日批视频 | 99热播精品| 大又大粗又爽又黄少妇毛片 | 亚洲大尺度视频 | 天天操夜夜操 | 久夜精品| va在线播放 | 一区二区三区免费看视频 | 国产自在线拍 | 男人激烈吮乳吃奶爽文 | 一边顶弄一边接吻 | 亚洲精品小视频在线观看 | 国产欧美一区二区视频 | 宅男午夜在线 | 国产鲁鲁| 天天精品综合 | 91老师片黄在线观看 | 比利时xxxx性hd极品 | 天天色影综合网 | 肉肉av福利一精品导航 | 久久精品视频一区 | 蜜臀av一区二区 | 一本到高清 | 爱爱视频一区二区 | 极品淫少妇 | 自拍偷拍亚洲欧洲 | 日韩av免费在线播放 | 亚洲欧美精品午睡沙发 | 日韩视频在线视频 | 污视频大全 | 国产欧美日韩精品一区二区三区 | 91欧美一区二区 | www亚洲视频 | 国产一级影片 | 日韩欧美国产一区二区在线观看 | 亚洲天堂国产精品 | 久久久久亚洲色欲AV无码网站 | 天天操夜夜爱 | 骚虎免费视频 | 成人欧美一区二区三区黑人 | caopor在线视频|