Inside ObjectBuilder Part1

 
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;
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值