`
cdragon
  • 浏览: 79214 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

依赖注入

阅读更多

       架构体系(Architectural pattern)

      在软件工程领域,软件架构或架构体系,是对软件体系结构主体的总称。它始终一致地以“严格描述、简单使用”为根本目标,注重于重用性、性能考量、安全性和扩展性、稳定性等架构指标。并对元素、关系类型、使用约束进行描述,规范软件体系内部各个组成部分(包括子系统)的责任与关系,解决架构方面的问题。

 

  --以上出自“维基百科”。

注:如果说“系统架构”(SoS)说明了软件是什么的问题,那么“软件架构”则是解决软件该如何做,以达到系统的目的。两者的差别,是决不能混淆!

 

绪:我们说编程就是对机器进行控制。而IoC的原则总体上是反其道而行,即系统控制程序。--个人理解。

 

         一、IoC

      架构体系在编程领域的具体应用,体现为具有普遍意义的设计制式(模型一说,稍显死板!),用于指导具体实现的策略。GoF进一步将其归纳为23种制式。

 

      在架构领域,必须提到的是依循"Hollywood Principle"、有着广泛而深入应用的"隐式调用"(implicit invocation)。更因其在虚拟化等领域广为使用,所以尤为独特和重要。

 

   这也是我们通常所说的"控制反转"--IoC(Inversion of Control)。

     

      IoC符合高凝聚低耦合(high cohesion and loose coupling)的原则:

 

      在编程设计领域,它以Observer制式出现;在代码实现领域,它展现为Callback技术。

 

      2004年,Martin Fowler(PEAA的作者)对IoC进行了专文论述。详见以下链接。

 

      在文中,作者并没有指出service locator和dependency injection两种模式孰优孰劣,仅以一句“具体使用因场景而变化”便一带而过。但却于文中强调了两者的共性部分,即“服务的配置和它的使用相独立”这一理念。这就是,把系统的集成和配置从应用程序中分离出来,简称“依赖注入”(dependency injection)。

 

     注:HollywoodPrinple,来源于好莱坞对业余等待试镜的演员的答复。“don't call us,we'll call you”.具体在编程领域,它是指“insted of a program running the system,the system runs a program”的方法论.面向对象的事件驱动程序即是此一原则的应用。

 

       二、IoC的应用之一,事件始末

     事件的本质,其一是把对事件处理延迟(或称为后置),而在请求方(或发生方)保留配置,在实现方或应答方进行注册或注销,从而将配置与实现分离。具体见示例。

       

using System;

namespace EventExample
{
    ///<summary>
    /// MainClass : 主应用程序类
    ///</summary>
    class MainClass
    {
        ///<summary>
        ///应用程序的主入口点。
        ///</summary>
        [STAThread]
        static void Main(string[] args)
        {
            EventPublishor   Publishor = new EventPublishor();
            EventSubscribor1 Registor1 = new EventSubscribor1(Publishor);
            EventSubscribor2 Registor2 = new EventSubscribor2(Publishor);
            Publishor.DoSomthing();
            Console.WriteLine("This program already finished!");
            Console.ReadLine();
        }
    }

    ///<summary>
    /// EventPublishor : 事件的发布器。
    ///</summary>
    public class EventPublishor
    {
        // 第一步是申明委托
        public delegate int sampleEventDelegate(string messageInfo);
        // 第二步是申明与上述委托相关的事件
        public event sampleEventDelegate sampleEvent;

        public EventPublishor()
        {
        }
        public void DoSomthing()
        {
            /* ... */
            // 激发事件
            if (this.sampleEvent != null)
            {
                this.sampleEvent("hello world!");
            }
            /* ... */
        }
    }
    
    ///<summary>
    /// EventSubscribor1 : 事件的注册器1。
    ///</summary>
    public class EventSubscribor1
    {
        public EventSubscribor1(EventPublishor Publishor)
        {
            Publishor.sampleEvent +=
               new EventExample.EventPublishor.sampleEventDelegate(ResponseEventMethod);
        }
        private int ResponseEventMethod(string msg)
        {
            Console.WriteLine(msg + " --- This is from Registor1");
            return 0;
        }
    }
    
    ///<summary>
    /// EventSubscribor2 : 事件的注册器2。
    ///</summary>
    public class EventSubscribor2
    {
        public EventSubscribor2(EventPublishor Publishor)
        {
            Publishor.sampleEvent +=
               new EventExample.EventPublishor.sampleEventDelegate(ResponseEventMethod);
            Publishor.sampleEvent +=
               new EventExample.EventPublishor.sampleEventDelegate(ResponseEventMethod);
        }
        private int ResponseEventMethod(string msg)
        {
            Console.WriteLine(msg + " --- This is from Registor2");
            Console.WriteLine("Please:down enter key!");
            Console.ReadLine();
            Console.WriteLine("ok");
            return 0;
        }
    }
}

      

   输出:
  
  

   三、IoC的应用之二,委托的异步回调

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Runtime.Remoting.Messaging;

namespace AsyncCallbackDelegate
{
    public delegate int MyDelegate(int x);
    public class MyClass
    {
        //A method to be invoke by the delegate
        public int MyMethod(int x)
        {
            //semulate a long runing proccess
            Thread.Sleep(10000);
            return x * x;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyClass myClass1 = new MyClass();
            MyDelegate del = new MyDelegate(myClass1.MyMethod);

            //Invoke our methe in another thread
            IAsyncResult async = del.BeginInvoke(5, new AsyncCallback(MyCallBack), "A message from the main thread");

            Console.WriteLine("Proccessing the Operation....");
            Console.ReadLine();
        }

        static void MyCallBack(IAsyncResult async)
        {
            AsyncResult ar = (AsyncResult)async;
            MyDelegate del = (MyDelegate)ar.AsyncDelegate;
            int x = del.EndInvoke(async);
            
            //make use of the state object.
            string msg = (string)async.AsyncState;
            Console.WriteLine("{0}, Result is: {1}", msg, x);
        }
    }
}

 

其它:

依赖关系在类关系图(UML)中是重要关系之一,而UML在应用场景中才有意义。依赖的本意即dependency,是依赖、受控于的意思,也就是“必要条件”(关联关系是“充分条件”);IoC控制反转的“神奇”在于,与DI联手,实现解耦以至对象在上下文的扁平化。

 

 

 

 

参考:

 

     http://martinfowler.com/articles/injection.html.

     http://www.kuqin.com/dotnet/20080511/8322.html

 

小结:

 IoC和对象嵌套,是初涉OO领域时,较易忽略的两处。

  • 大小: 6.5 KB
0
0
分享到:
评论

相关推荐

    c# 依赖注入 控制反转

    ### C# 依赖注入 控制反转 #### 一、IoC(控制反转)简介 IoC,即"Inversion of Control"(控制反转),是软件工程领域的一个重要概念,特别是面向对象编程中的一个关键设计原则。从字面上理解,IoC指的是程序运行...

    依赖注入那些事儿

    ### 依赖注入那些事儿 #### 1. IGame游戏公司的故事 ##### 1.1 讨论会 IGame是一家专注于开发动作角色扮演游戏的游戏公司。这类游戏通常包含一个基础功能——打怪,即玩家通过攻击怪物来获得经验值、虚拟货币和...

    一个轻量级的PHP依赖注入框架

    依赖注入(Dependency Injection,简称DI)是一种设计模式,它在软件工程中被广泛应用于解耦组件,提高代码的可测试性和可维护性。在PHP世界里,依赖注入框架可以帮助开发者更方便地管理类之间的依赖关系,减少硬...

    .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

    最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中,但是在服务调用的时候总是获取到最后注入的那个方法的实现,这...

    spring学习:依赖注入的几种方式讨论

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本文将深入探讨Spring中的依赖注入实现方式,以及如何通过样例文件...

    EFcore Repository 依赖注入方式实现数据库基本操作

    依赖注入(Dependency Injection, DI)是一种设计模式,它有助于降低代码耦合度,提高可测试性和可维护性。本篇文章将深入探讨如何使用EF Core结合依赖注入来实现数据库的基本操作。 1. **EF Core 简介** EF Core ...

    IoC 依赖注入 技术总结

    "IoC 依赖注入 技术总结" IoC 依赖注入技术是软件设计中的一种重要技术,旨在解决软件系统中的耦合问题。该技术的核心思想是将被调用构件实例化,并注入到调用构件之中,以实现软件系统的高内聚、低耦合。IoC 依赖...

    spring依赖注入底层详解

    Spring依赖注入是Spring框架的核心特性之一,它极大地简化了Java应用程序的开发,使得对象之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。本文将深入探讨Spring依赖注入的底层实现机制。 首先,我们要...

    C# (.NET Core 6.0) DI依赖注入 示例

    较为框架式的演示了DI服务依赖注入 适用于熟悉C#中的继承,基本的Core命令使用等. 该示例演示了以服务器集群为背景的各种业务的依赖注入. 示例来自于B站杨中科老师的.NET Core(6.0)教学.

    Angular6依赖注入Demo

    这个“Angular6依赖注入Demo”显然提供了关于如何在Angular6应用中使用依赖注入的实际示例,同时也包含了懒加载(Lazy Loading)的实现,这有助于提高应用程序的性能,因为只有在用户实际需要时才会加载特定模块。...

    PHP依赖注入容器库

    在IT行业中,依赖注入(Dependency Injection,简称DI)是一种设计模式,它有助于提高代码的可测试性、可维护性和灵活性。PHP作为一个广泛用于Web开发的动态类型语言,也有许多优秀的依赖注入容器库来支持这一模式。...

    Spring Ioc 注解 依赖注入

    ### Spring IoC与注解依赖注入详解 #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一个开源项目,最初是为了解决企业级应用开发中的复杂性问题而诞生的。Spring框架的核心特性包括IoC(Inversion of ...

    模仿Spring依赖注入

    【Spring依赖注入详解】 在Java开发中,Spring框架以其强大的依赖注入(Dependency Injection,简称DI)功能而闻名。依赖注入是一种设计模式,它允许我们解耦组件,使我们的应用程序更加灵活,易于测试和维护。本篇...

    反射与依赖注入DEMO

    在编程领域,反射和依赖注入是两种非常重要的概念,它们都是高级编程技术,可以极大地提升代码的灵活性和可维护性。下面将详细讲解这两个概念及其在实际应用中的DEMO示例。 **反射** 反射是Java(以及其他一些面向...

    详解Spring基于Annotation的依赖注入实现

    在深入探讨Spring框架中基于注解(Annotation)的依赖注入(Dependency Injection,简称DI)实现之前,我们首先需要理解几个核心概念:Spring框架、依赖注入、以及注解本身。 ### Spring框架简介 Spring框架是一个...

    php依赖注入demo

    依赖注入的核心思想是,一个对象不应该负责创建或查找它所依赖的对象,而是应该由外部源(如容器或框架)来提供这些依赖。这样可以减少类之间的耦合,使得代码更加灵活和易于测试。在PHP中,我们通常通过构造函数、...

    Spring 核心机制(依赖注入)

    ### Spring核心机制——依赖注入详解 #### 一、引言 Spring框架作为一款优秀的轻量级Java应用开发框架,其核心理念之一就是依赖注入(Dependency Injection, DI)。依赖注入不仅能够帮助开发者降低代码间的耦合度...

    C++ 依赖注入

    C++依赖注入是一种设计模式,它对于简化软件设计、控制依赖关系、降低耦合度、提高代码的内聚度以及方便进行单元测试具有重要作用。依赖注入的核心思想是将依赖对象的创建和使用分离,通过第三方(例如容器)在对象...

    第三章 Spring4 依赖注入

    【标题】"第三章 Spring4 依赖注入"深入解析 在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种核心的设计模式,它允许我们创建松耦合的代码,提高软件的可测试性和可维护性。Spring4版本进一步优化...

Global site tag (gtag.js) - Google Analytics