Object Builder Application Block
文
/
黃忠成
2006/9/21
一、
IoC
簡介
IoC
的全名是『
Inversion of Control
』,字面上的意思是『控制反轉』,要了解這個名詞的真正含意,得從『控制』這個詞切入。一般來說,當設計師撰寫一個
Console
程式時,控制權是在該程式上,她決定著何時該印出訊息、何時又該接受使用者輸入、何時該進行資料處理,如程式
1
。
程式
1
using
System;
using
System.Collections.Generic;
using
System.Text;
namespace
ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Console.Write("Please Input Some Words:");
string inputData = Console.ReadLine();
Console.WriteLine(inputData);
Console.Read();
}
}
}
|
從整個流程上看來,
OS
將控制權交給了此程式,接下來就看此程式何時將控制權交回,這是
Console
模式的標準處理流程。程式
1
演譯了『控制』這個字的意思,那麼『反轉』這個詞的涵意呢?這可以用一個
Windows Application
來演譯,如程式
2
。
程式
2
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Text;
using
System.Windows.Forms;
namespace
WindowsApplication10
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(textBox1.Text);
}
}
}
|
與程式
1
不同,當程式
2
被執行後,控制權其實並不在此程式中,而是在底層的
Windows Forms Framework
上,當此程式執行後,控制權會在
Application.Run
函式呼叫後,由主程式轉移到
Windows Forms Framework
上,進入等待訊息的狀態,當使用者按下了
Form
上的按鈕後,底層的
Windows Forms Framework
會收到一個訊息,接著會依照訊息來呼叫
button1_Click
函式,此時控制權就由
Windows Forms Framework
轉移到了主程式。程式
2
充份演譯了『控制反轉』的意含,也就是將原本位於主程式中的控制權,反轉到了
Windows Forms Framework
上。
二、
Dependency Injection
IoC
的中心思想在於控制權的反轉,這個概念於現今的
Framework
中相當常見,
.NET Framework
中就有許多這樣的例子,問題是!既然這個概念已經實作於許多
Framework
中,那為何近年來
IoC
會於社群引起這麼多的討論?著名的
IoC
實作體如
Avalo
n
、Spring又達到了什麼目的呢?就筆者的認知,IoC是一個廣泛的概念,主要中心思想就在於控制權的反轉,Windows Forms Framework與Spring在IoC的大概念下,都可以算是IoC的實作體,兩者不同之處在於究竟反轉了那一部份的控制權,Windows Forms Framework將主程式的控制權反轉到了自身上,Spring則是將物件的建立、釋放、配置等控制權反轉到自身,雖然兩者都符合IoC的大概念,但設計初衷及欲達成的目的完全不同,因此用IoC來統稱兩者,就顯得有些籠統及模糊。
設計大師
Martin Fowler
針對
Spring
這類型
IoC
實作體提出了一個新的名詞『
Dependency Injection
』,字面上的意思是『依賴注入』。對筆者而言,這個名詞比起
IoC
更能描述現今許多宣稱支援
IoC
的
Framework
內部的行為,在
Martin Fowler
的解釋中,
Dependency Injection
分成三種,一是
Interface Injection(
介面注射
)
、
Constructor Injection(
建構子注射
)
、
Setter Injection(
設值注射
)
。
2-1
、
Why we need Dependency Injectio
n
?
OK
,花了許多篇幅在解釋
IoC
與
Dependency Injection
兩個概念,希望讀者們已經明白這兩個名詞的涵意,在切入
Dependency Injection
這個主題前,我們要先談談為何要使用
Dependency Injection
,及這樣做帶來了什麼好處,先從程式
3
的例子開始。
程式
3
using
System;
using
System.Collections.Generic;
using
System.Text;
namespace
DISimple
{
class Program
{
static void Main(string[] args)
{
InputAccept accept = new InputAccept(new PromptDataProcessor());
accept.Execute();
Console.ReadLine();
}
}
public class InputAccept
{
private IDataProcessor _dataProcessor;
|