Spring.NET学习笔记1——控制反转(基础篇) Level 200
在學習Spring.NET這個控制反轉(IoC)和面向切面(AOP)的容器框架之前,我們先來看一下什么是控制反轉(IoC)。
控制反轉(Inversion of Control,英文縮寫為IoC),也叫依賴注入(Dependency Injection)。我個人認為控制反轉的意思是依賴對象(控制權)發生轉變,由最初的類本身來管理依賴對象轉變為IoC框架來管理這些對象,使得依賴脫離類本身的控制,從而實現松耦合。
我們先來看一段代碼
Codenamespace?Dao
{
????public?interface?IPersonDao
????{
????????void?Save();
????}
????public?class?PersonDao?:?IPersonDao
????{
????????public?void?Save()
????????{
????????????Console.WriteLine("保存?Person");
????????}
????}
}
namespace?SpringNetIoC
{
????class?Program
????{
????????private?static?void?NormalMethod()
????????{
????????????IPersonDao?dao?=?new?PersonDao();
????????????dao.Save();
????????????Console.WriteLine("我是一般方法");
????????}
????}
}
?
Program必然需要知道IPersonDao接口和PersonDao類。為了不暴露具體實現,我可以運用設計模式中的抽象工廠模式(Abstract Factory)來解決。
?
namespace?DaoFactory{
????public?static?class?DataAccess
????{
????????public?static?IPersonDao?CreatePersonDao()
????????{
????????????return?new?PersonDao();
????????}
????}
}
?
FactoryMethodnamespace?SpringNetIoC
{
????class?Program
????{????????private?static?void?FactoryMethod()
????????{
????????????IPersonDao?dao?=?DataAccess.CreatePersonDao();
????????????dao.Save();
????????????Console.WriteLine("我是工廠方法");
????????}
????}
}
這時,Program只需要知道IPersonDao接口和工廠,而不需要知道PersonDao類。然后我們試圖想象,要是有這樣的工廠框架幫我們管理依賴的對象就好了,于是控制反轉出來了。
?
App.config<?xml?version="1.0"?encoding="utf-8"??>
<configuration>
??<configSections>
????<sectionGroup?name="spring">
??????<section?name="context"?type="Spring.Context.Support.ContextHandler,?Spring.Core"?/>
??????<section?name="objects"?type="Spring.Context.Support.DefaultSectionHandler,?Spring.Core"?/>
????</sectionGroup>
??</configSections>
??<spring>
????<context>
??????<resource?uri="config://spring/objects"?/>
????</context>
????<objects?xmlns="http://www.springframework.net">
??????<description>一個簡單的控制反轉例子</description>
??????<object?id="PersonDao"?type="Dao.PersonDao,?Dao"?/>
????</objects>
??</spring>
</configuration>
?
Programusing?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
using?Dao;
using?DaoFactory;
using?Spring.Context;
using?Spring.Context.Support;
namespace?SpringNetIoC
{
????class?Program
????{
????????static?void?Main(string[]?args)
????????{
????????????//NormalMethod();??//?一般方法
????????????//FactoryMethod();??//?工廠方法
????????????IoCMethod();??//?IoC方法"
????????????Console.ReadLine();
????????}
????????private?static?void?NormalMethod()
????????{
????????????IPersonDao?dao?=?new?PersonDao();
????????????dao.Save();
????????????Console.WriteLine("我是一般方法");
????????}
????????private?static?void?FactoryMethod()
????????{
????????????IPersonDao?dao?=?DataAccess.CreatePersonDao();
????????????dao.Save();
????????????Console.WriteLine("我是工廠方法");
????????}
????????private?static?void?IoCMethod()
????????{
????????????IApplicationContext?ctx?=?ContextRegistry.GetContext();
????????????IPersonDao?dao?=?ctx.GetObject("PersonDao")?as?IPersonDao;
????????????if?(dao?!=?null)
????????????{
????????????????dao.Save();
????????????????Console.WriteLine("我是IoC方法");
????????????}
????????}
????}
}
一個簡單的控制反轉程序例子就實現了。
這樣從一定程度上解決了Program與PersonDao耦合的問題,但是實際上并沒有完全解決耦合,只是把耦合放到了XML 文件中,通過一個容器在需要的時候把這個依賴關系形成,即把需要的接口實現注入到需要它的類中。我個人認為可以把IoC模式看做是工廠模式的升華,可以把IoC看作是一個大工廠,只不過這個大工廠里要生成的對象都是在XML文件中給出定義的。
代碼下載
我最近也是在學習Spring.NET,如果有和我不同意見的朋友可以給我留言或者發送EMail,我們可以約定時間共同學習和探討。
?
?
返回目錄
轉載于:https://www.cnblogs.com/GoodHelper/archive/2009/10/25/Spring_NET_IoC.html
總結
以上是生活随笔為你收集整理的Spring.NET学习笔记1——控制反转(基础篇) Level 200的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 制作自己的Puppy Linux Liv
- 下一篇: perl 的mail严格正则表达式到底要