Inside ObjectBuilder Part1

本文介绍了依赖注入(Dependency Injection)的概念,包括接口注射、构造器注射和设值注射,探讨了为何需要依赖注入以及它带来的好处。通过示例说明了如何降低对象间的耦合性和简化对象创建过程,提到了ObjectBuilder、Spring等框架如何实现这一概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
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;
$(function(){ $.fn.extend({ SimpleTree:function(options){ //初始化参数 var option = $.extend({ click:function(a){ } },options); option.tree=this; /* 在参数对象中添加对当前菜单树的引用,以便在对象中使用该菜单树 */ option._init=function(){ /* * 初始化菜单展开状态,以及分叉节点的样式 */ this.tree.find("ul ul").hide(); /* 隐藏所有子级菜单 */ this.tree.find("ul ul").prev("li").removeClass("open"); /* 移除所有子级菜单父节点的 open 样式 */ this.tree.find("ul ul[show='true']").show(); /* 显示 show 属性为 true 的子级菜单 */ this.tree.find("ul ul[show='true']").prev("li").addClass("open"); /* 添加 show 属性为 true 的子级菜单父节点的 open 样式 */ }/* option._init() End */ /* 设置所有超链接不响应单击事件 */ this.find("a").click(function(){ $(this).parent("li").click(); return false; }); /* 菜单项 接受单击 */ this.find("li").click(function(){ /* * 当单击菜单项 * 1.触发用户自定义的单击事件,将该 标签中的第一个超链接做为参数传递过去 * 2.修改当前菜单项所属的子菜单的显示状态(如果等于 true 将其设置为 false,否则将其设置为 true) * 3.重新初始化菜单 */ option.click($(this).find("a")[0]); /* 触发单击 */ /* * 如果当前节点下面包含子菜单,并且其 show 属性的值为 true,则修改其 show 属性为 false * 否则修改其 show 属性为 true */ /* if($(this).next("ul").attr("show")=="true"){ $(this).next("ul").attr("show","false"); }else{ $(this).next("ul").attr("show","true"); }*/ /* 初始化菜单 */ option._init(); }); /* 设置所有父节点样式 */ this.find("ul").prev("li").addClass("folder"); /* 设置节点“是否包含子节点”属性 */ this.find("li").find("a").attr("hasChild",false); this.find("ul").prev("li").find("a").attr("hasChild",true); /* 初始化菜单 */ option._init(); }/* SimpleTree Function End */ }); });
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值