Spring.NET學習筆記9——打造簡易的依賴注入框架(練習篇) Level 100

  我們在第三篇中學習里一個簡易的IoC框架。今天我們接著上次的程序,實現帶參數構造函數對象的實例和屬性的注入 。
  我們知道可以通過反射獲取類的構造函數及參數(GetConstructors方法);可以獲取屬性和屬性的類型(GetProperties方法)。通過
Activator的CreateInstance(Type type, params object[] args)方法可以創建帶參數構造函數的實例。通過SetValue方法可以給屬性賦值,這樣一來,我們就上次的代碼稍加改造就可以實現屬性的注入了。


  下面是完成的代碼:

ContractedBlock.gifExpandedBlockStart.gifDomain
????public?class?Person
ExpandedBlockStart.gifContractedBlock.gif????
{
ExpandedSubBlockStart.gifContractedSubBlock.gif????????
public?string?Name?{?get;?set;?}
ExpandedSubBlockStart.gifContractedSubBlock.gif????????
public?int?Age?{?get;?set;?}
????}


???
public?class?PersonDao
ExpandedBlockStart.gifContractedBlock.gif????
{
????????
private?int?intProp;

????????
public?PersonDao(int?intProp)
ExpandedSubBlockStart.gifContractedSubBlock.gif????????
{
????????????
this.intProp?=?intProp;
????????}


ExpandedSubBlockStart.gifContractedSubBlock.gif????????
public?Person?Entity?{?get;?set;?}

????????
public?override?string?ToString()
ExpandedSubBlockStart.gifContractedSubBlock.gif????????
{
????????????
return?"構造函數參數intProp為:"?+?this.intProp;
????????}

????}

?

ContractedBlock.gifExpandedBlockStart.gifObjectFactory
public?class?ObjectFactory
ExpandedBlockStart.gifContractedBlock.gif????
{
????????
private?IDictionary<string,?object>?objectDefine?=?new?Dictionary<string,?object>();

????????
private?ObjectFactory(string?fileName)
ExpandedSubBlockStart.gifContractedSubBlock.gif????????
{
????????????InstanceObjects(fileName);??
//?實例IoC容器
????????????DiObjects(fileName);??//?屬性注入
????????}


????????
private?static?ObjectFactory?instance;

????????
private?static?object?lockHelper?=?new?object();

????????
public?static?ObjectFactory?Instance(string?fileName)
ExpandedSubBlockStart.gifContractedSubBlock.gif????????
{
????????????
if?(instance?==?null)
ExpandedSubBlockStart.gifContractedSubBlock.gif????????????
{
????????????????
lock?(lockHelper)
ExpandedSubBlockStart.gifContractedSubBlock.gif????????????????
{
????????????????????instance?
=?instance????new?ObjectFactory(fileName);
????????????????}

????????????}

????????????
return?instance;
????????}


ExpandedSubBlockStart.gifContractedSubBlock.gif????????
/**////?<summary>
????????
///?實例IoC容器
????????
///?</summary>
????????
///?<param?name="fileName"></param>

????????private?void?InstanceObjects(string?fileName)
ExpandedSubBlockStart.gifContractedSubBlock.gif????????
{
????????????XElement?root?
=?XElement.Load(fileName);
????????????var?objects?
=?from?obj?in?root.Elements("object")
??????????????????????????select?obj;

????????????
//無參構造函數
????????????objectDefine?=?objects.Where(obj?=>
????????????????obj.Element(
"constructor-arg")?==?null).ToDictionary(
????????????????????k?
=>?k.Attribute("id").Value,?
????????????????????v?
=>?
ExpandedSubBlockStart.gifContractedSubBlock.gif????????????????????
{
????????????????????????
string?typeName?=?v.Attribute("type").Value;??
????????????????????????Type?type?
=?Type.GetType(typeName);??
????????????????????????
return?Activator.CreateInstance(type);
????????????????????}

????????????????);

????????????
//有參構造函數
????????????foreach?(XElement?item?in?objects.Where(obj?=>?
????????????????obj.Element(
"constructor-arg")?!=?null))
ExpandedSubBlockStart.gifContractedSubBlock.gif????????????
{??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
????????????????
string?id?=?item.Attribute("id").Value;
????????????????
string?typeName?=?item.Attribute("type").Value;
????????????????Type?type?
=?Type.GetType(typeName);
????????????????var?args?
=?from?property?in?type.GetConstructors()[0].GetParameters()
???????????????????????????join?el?
in?item.Elements("constructor-arg")
???????????????????????????on?property.Name?equals?el.Attribute(
"name").Value
???????????????????????????select?Convert.ChangeType(el.Attribute(
"value").Value,
???????????????????????????property.ParameterType);
????????????????
object?obj?=?Activator.CreateInstance(type,?args.ToArray());
????????????????objectDefine.Add(id,?obj);
????????????}

????????}


ExpandedSubBlockStart.gifContractedSubBlock.gif????????
/**////?<summary>
????????
///?屬性注入
????????
///?</summary>
????????
///?<param?name="fileName"></param>

????????private?void?DiObjects(string?fileName)
ExpandedSubBlockStart.gifContractedSubBlock.gif????????
{
????????????XElement?root?
=?XElement.Load(fileName);
????????????var?objects?
=?from?obj?in?root.Elements("object")
??????????????????????????select?obj;

????????????
foreach?(KeyValuePair<string,object>?item?in?objectDefine)
ExpandedSubBlockStart.gifContractedSubBlock.gif????????????
{
????????????????
foreach?(var?el?in?objects.Where(e?=>?
????????????????????e.Attribute(
"id").Value?==?item.Key).Elements("property"))
ExpandedSubBlockStart.gifContractedSubBlock.gif????????????????
{
????????????????????Type?type?
=?item.Value.GetType();
????????????????????
//獲取屬性
????????????????????foreach?(PropertyInfo?property?in?type.GetProperties())
ExpandedSubBlockStart.gifContractedSubBlock.gif????????????????????
{
????????????????????????
if?(property.Name?==?el.Attribute("name").Value)
ExpandedSubBlockStart.gifContractedSubBlock.gif????????????????????????
{
????????????????????????????
if?(el.Attribute("value")?!=?null)
ExpandedSubBlockStart.gifContractedSubBlock.gif????????????????????????????
{
????????????????????????????????
//設置屬性值
????????????????????????????????property.SetValue(item.Value,?
????????????????????????????????????Convert.ChangeType(el.Attribute(
"value").Value,?
????????????????????????????????????property.PropertyType),?
null);
????????????????????????????}

????????????????????????????
else?if?(el.Attribute("ref")?!=?null)
ExpandedSubBlockStart.gifContractedSubBlock.gif????????????????????????????
{
????????????????????????????????
object?refObject?=?null;

????????????????????????????????
if?(objectDefine.ContainsKey(el.Attribute("ref").Value))
ExpandedSubBlockStart.gifContractedSubBlock.gif????????????????????????????????
{
????????????????????????????????????refObject?
=?objectDefine[el.Attribute("ref").Value];
????????????????????????????????}

????????????????????????????????
//設置關聯對象屬性
????????????????????????????????property.SetValue(item.Value,?refObject,?null);
????????????????????????????}

????????????????????????}

????????????????????}

????????????????}

????????????}

????????}


ExpandedSubBlockStart.gifContractedSubBlock.gif????????
/**////?<summary>
????????
///?獲取對象
????????
///?</summary>
????????
///?<param?name="id"></param>
????????
///?<returns></returns>

????????public?object?GetObject(string?id)
ExpandedSubBlockStart.gifContractedSubBlock.gif????????
{
????????????
object?result?=?null;

????????????
if?(objectDefine.ContainsKey(id))
ExpandedSubBlockStart.gifContractedSubBlock.gif????????????
{
????????????????result?
=?objectDefine[id];
????????????}


????????????
return?result;
????????}

????}

?

ContractedBlock.gifExpandedBlockStart.gifApp.config
<?xml?version="1.0"?encoding="utf-8"??>

<objects>

??
<object?id="person"?type="SpringNetMyDi.Person,?SpringNetMyDi">
????
<!--屬性值類型注入-->
????
<property?name="Name"?value="Liu?Dong"/>
????
<property?name="Age"?value="27"/>

??
</object>

??
<object?id="personDao"?type="SpringNetMyDi.PersonDao,?SpringNetMyDi">
????
<!--構造器注入-->
????
<constructor-arg?name="intProp"?value="1"/>

????
<property?name="Entity"?ref="person"?/>
????
??
</object>

</objects>

?

ContractedBlock.gifExpandedBlockStart.gifProgram
???class?Program
ExpandedBlockStart.gifContractedBlock.gif????
{
????????
static?void?Main(string[]?args)
ExpandedSubBlockStart.gifContractedSubBlock.gif????????
{
????????????ObjectFactory?factory?
=?ObjectFactory.Instance(@"F:\Exercise\SpringNet\Step1\SpringNet_Lesson9\SpringNetMyDi\Objects.xml");

????????????PersonDao?dao?
=?(PersonDao)factory.GetObject("personDao");

????????????Console.WriteLine(
"姓名:"?+?dao.Entity.Name);
????????????Console.WriteLine(
"年齡:"?+?dao.Entity.Age);
????????????Console.WriteLine(dao);

????????????Console.ReadLine();
????????}

????}

?

?輸入結果:

?

?

?

?

?代碼下載

?

?

  返回目錄

轉載于:https://www.cnblogs.com/GoodHelper/archive/2009/11/02/SpringNet_MyDi.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276336.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276336.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276336.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PHP 利用Mail_MimeDecode類提取郵件正文

參考鏈接&#xff1a;http://blog.csdn.net/dmtnewtons_blog/article/details/18765289 rfc mail content-type&#xff1a; 參考鏈接&#xff1a;http://blog.csdn.net/dmtnewtons_blog/article/details/19327105 根據主流的郵件解析類Mail_MimeDecode&#xff0c;提取郵件正…

android 單元測試

首先AndroidManifest.xml View Code <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"com.travelsky.test" android:versionCode"1"androi…

申萬一級行業日指數_基金收評 | 指數震蕩走弱,軍工股成兩市主線!后期行情如何?...

收評君復盤日記(2020年9月21日)三大指數集體收跌&#xff0c;北向資金全天大幅凈流出近65億元&#xff0c;軍工板塊表現強勢。盤面回顧9月21日&#xff0c;兩市全天高開低走&#xff0c;早盤指數弱勢震蕩&#xff0c;三大指數盤中一度翻紅&#xff0c;但隨后震蕩走弱&#xff0…

若川的2016年度總結,畢業工作

可以點擊上方的標簽若川的故事、年度總結&#xff0c;查看往期文章有讀者反饋說看我年度總結系列比我源碼系列更有啟發。所以打算把2016-2018的年度總結發布到公眾號聲明原創&#xff0c;希望對大家有所啟發。&#xff08;雖然我的每一年都過得非常普通...&#xff09;以下是正…

jQuery之Ajax

轉載鏈接&#xff1a;http://cargoj.iteye.com/blog/1008047 1 . jQuery幫助之Ajax請求&#xff08;一&#xff09;jQuery.ajax(options) 2 . jQuery幫助之Ajax請求&#xff08;二&#xff09;jQuery.get(url,[data],[callback] 3 . jQuery幫助之Ajax請求&#xff08;三&am…

深入淺出之正則表達式(二)

深入淺出之正則表達式&#xff08;二&#xff09; http://dragon.cnblogs.com/archive/2006/05/09/394923.html 前言&#xff1a; 本文是前一片文章《深入淺出之正則表達式&#xff08;一&#xff09;》的續篇&#xff0c;在本文中講述了正則表達式中的組與向后引用&…

MVC(溫習深入)

MVC&#xff08;Model-View-Controller&#xff0c;模型—視圖—控制器模式&#xff09;是軟件工程中的一種軟件架構模式。它把軟件系統分為三個基本部分&#xff1a;模型&#xff08;Model&#xff09;&#xff0c;視圖&#xff08;View&#xff09;和控制器&#xff08;Contr…

面試官問:能否模擬實現JS的new操作符(高頻考點)

可以點擊上方的話題JS基礎系列&#xff0c;查看往期文章這篇文章寫于2018年11月05日&#xff0c;new模擬實現&#xff0c;Object.create是面試高頻考點&#xff0c;之前發布在掘金有近2萬人閱讀&#xff0c;現在發布到公眾號聲明原創。1. 前言這是面試官問系列的第一篇&#xf…

Linux環境下設置IPDNSGateway

轉載鏈接&#xff1a;http://www.myhack58.com/Article/sort099/sort0102/2011/29291.htm 在Linux中不管你是做服務器還是只是平常使用&#xff0c;上網肯定都是最重要和不可缺少的一個因素之一&#xff0c;所以就涉及到它的ip gateway dns等network配置和使用。但是設置Linux…

跟我一起學WCF(2)——利用.NET Remoting技術開發分布式應用

一、引言 上一篇博文分享了消息隊列&#xff08;MSMQ&#xff09;技術來實現分布式應用&#xff0c;在這篇博文繼續分享下.NET平臺下另一種分布式技術——.NET Remoting。 二、.NET Remoting 介紹 2.1 .NET Remoting簡介 .NET REmoting與MSMQ不同&#xff0c;它不支持離線可得&…

二叉樹的建立與遍歷_51、二叉樹遍歷-重建二叉樹JZ4

題目描述輸入某二叉樹的前序遍歷和中序遍歷的結果&#xff0c;請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6}&#xff0c;則重建二叉樹并返回。思路回顧三種經典的遍歷&…

越來越覺得現在的工作很枯燥

很不想這么說&#xff0c;但又不想欺騙自己&#xff0c;真的是很枯燥&#xff0c;不過這種感覺早在一年在在上一間公司時就很強烈的有過這種感覺了&#xff0c;只不過現在是又一次有感觸罷了。話說說我這種性質的工作枯燥很多人都講過&#xff0c;如果哪個人說不枯燥估計腦袋進…

推薦關注這7個高質量的前端公眾號

拓寬眼界&#xff0c;增加深度&#xff0c;在閱讀的世界里&#xff0c;我們往往能找到不一樣的態度&#xff0c;提升朋友圈質量&#xff0c;從關注這幾個公眾號開始。輕掃一下二維碼就行了&#xff0c;你可以試試&#xff0c;肯定會有意外收獲。大遷世界 簡介&#xff1a;前端小…

MySQL 實用語句集合

MySQL 實用語句集合 參考鏈接[用戶]&#xff1a;http://blog.csdn.net/dmtnewtons_blog/article/details/9136339 參考鏈接[屬性]&#xff1a;http://stackoverflow.com/questions/15821532/get-current-auto-increment-value-for-any-table 參考鏈接[索引]&#xff1a;htt…

python對象序列化或持久化的方法

http://blog.csdn.net/chen_lovelotus/article/details/7233293 一、Python對象持久化方法 目前為止&#xff0c;據我所知&#xff0c;在python中對象持久化有以下幾種方法&#xff1a; 1. 使用(dbhash/bsddb, dbm, gdbm, dumbdbm 等&#xff09;以及它們的"管理器"(…

Windows Live Writer 在win2003 的安裝方法

下載Windows Live Writer整體安裝包&#xff0c;最好是離線安裝包 2.在xp系統上安裝 3.查找C:\Program Files\Common Files\Windows Live\.cache目錄 .cache目錄是隱藏的&#xff0c;目錄下面就是各個安裝文件的msi安裝包 4.拷貝相應的msi文件&#xff0c;到Windows 2003安裝就…

decode 大于比較 小于_6 燃氣輸配系統6.3 壓力不大于1.6Mpa的室外燃氣管道城鎮燃氣設計規范 GB500282006(2020修訂版)...

6.3 壓力不大于1.6Mpa的室外燃氣管道6.3.1中壓和低壓燃氣管道宜采用聚乙烯管、機械接口球墨鑄鐵管、鋼管或鋼骨架聚乙烯塑料復合管&#xff0c;并應符合下列要求&#xff1a; 1 聚乙烯燃氣管應符合現行的國家標準《燃氣用埋地聚乙烯管材》GB15558.1 和《燃氣用埋地聚乙烯管件…

若川的2017年度總結,一如既往

可以點擊上方的標簽若川的故事、年度總結&#xff0c;查看往期文章有讀者反饋說看我年度總結系列比我源碼系列更有啟發。所以打算把2016-2018的年度總結發布到公眾號聲明原創&#xff0c;希望對大家有所啟發。&#xff08;雖然我的每一年都過得非常普通...&#xff09;若川的20…

MIME協議及源郵件格式分析

轉載鏈接&#xff1a;http://wenku.baidu.com/view/7246de671ed9ad51f01df277.html 電子郵件也許是一個Internet上的流行最廣泛的應用。也是我們現在的大多數網絡辦公流程的基礎。各種郵件服務器很多,但都大都遵循以1982年出版的RFC822--《ARPA網絡文本信息格式標準(STANDARD F…

溝通:用故事產生共鳴

《溝通:用故事產生共鳴》(全彩) 基本信息作者&#xff1a; Nancy Duarte(南希.杜瓦特)譯者&#xff1a; 馮海洋出版社&#xff1a;電子工業出版社ISBN&#xff1a;9787121195914上架時間&#xff1a;2013-4-1出版日期&#xff1a;2013 年3月開本&#xff1a;12開頁碼&#xff1…