日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 伊人伊人鲁 | 射综合网 | 日本视频在线 | 色多多视频网站 | 青青草原一区二区 | 国产精品高潮呻吟久久aⅴ码 | 日韩精品一二 | 麻豆视频入口 | 亚洲精品欧美精品 | 中文字幕日韩高清 | 黄色大片毛片 | 伊人伊人 | 自拍超碰 | 亚洲熟女乱色综合亚洲av | 国产精品福利在线 | 欧美高清视频在线观看 | 秋霞成人 | 成人精品免费视频 | 欧美极品在线视频 | 日日久| 久久丫精品国产亚洲av不卡 | 久久久久久久影院 | 色www国产亚洲阿娇 自拍一区在线 | 国产自产在线 | 香蕉视频久久久 | 夜夜爽妓女8888视频免费观看 | 国产麻豆剧果冻传媒白晶晶 | www.成人av.com| 久草剧场 | 亚洲国产一二 | 亚洲欧美国产精品 | 6996电视影片免费看 | 免费黄色看片网站 | 久久精品午夜 | 少妇精品一区二区 | 日本理论片 | 日韩毛片在线视频 | 成人免费毛片网站 | 亚洲AV无码乱码国产精品牛牛 | 在线观看日韩国产 | 污污视频网站在线 | 亚洲一区二区三区免费在线观看 | 97se亚洲国产综合在线 | 蜜臀av性久久久久蜜臀aⅴ麻豆 | 蜜桃免费av| 亚洲午夜精品久久久 | 国产九九在线 | 欧美十大老熟艳星 | 黄视频免费看在线 | 少妇精品久久久久久久久久 | 久久久久久久久久久久久久国产 | 亚洲精品喷潮一区二区三区 | 一级aaaa毛片 | 亚洲天堂无吗 | 久久精品国产电影 | av之家在线 | av片一区二区 | 日韩欧美一区二区三区免费观看 | 国产亚洲精品成人a | 蜜桃视频一区二区在线观看 | 久久精品成人一区二区三区蜜臀 | 孕妇疯狂做爰xxxⅹ 国产精品乱码久久久久久 99久久久成人国产精品 | 色站在线 | 久久综合久久久久 | 日本高清不卡视频 | 午夜男人av | 青青草欧美 | 成人精品一区二区 | 日本激情网站 | 嫩草视频在线观看视频 | 亚洲人成人 | 嘿嘿射在线| 亚洲在线不卡 | 黄色欧美大片 | 亚洲第一黄色网 | 极品美女开粉嫩精品 | 丝袜美腿一区二区三区 | 艳妇乳肉豪妇荡乳av | 阿v天堂2018 俄罗斯丰满熟妇hd av色吧 | 成人在线观看免费网站 | 一级黄色大片网站 | 亚洲 高清 成人 动漫 | 国产综合无码一区二区色蜜蜜 | 亚洲成人精品视频 | 日韩aaaaaa | 欧美黄色免费网站 | 日韩av大片在线观看 | 国产二页| 亚洲网视频 | 光棍天堂av | 日本一区二区高清视频 | 国产在线视频不卡 | 中文字幕第10页 | 国产美女精品在线 | 亚洲另类天堂 | 深夜视频免费在线观看 | 在线成人欧美 | 国产永久免费 | 亚洲熟妇国产熟妇肥婆 |