`
lexinquan
  • 浏览: 47170 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

创建你自己的依赖注入容器Ioc Container

 
阅读更多

最近研究了Ioc,DI 以及一些开源的框架,以下根据自己的理解写一个简单的Ioc容器。我们在使用一个依赖注入容器时一般都是实现三步:

 

  1. 创建一个Ioc容器;
  2. 依赖关系注入,这里需要一种collection对象存储这种注入关系;
  3. 根据依赖注入获取对象的实例;

 

 

好了,接下来我们可以按照测试驱动开发的模式完成一个简易版本的注入容器:MinContainer

 

 

 

  • 测试代码:

 

 

 [TestMethod]
        public void CanNewContainerAndResolveType()
        {
            //
            // TODO: Add test logic here
            //
            IMinContainer container = new MinContainer();

            container.RegisterType(typeof(IDal),typeof(OracleDal));

            //var dal = container.Resolve(typeof(IDal));
            var dal = container.Resolve<IDal>();

            Assert.IsNotNull(container);

            Assert.IsInstanceOfType(dal, typeof(OracleDal));

        }

 

 

  • 定义接口

 

 

创建容器时定义了一个接口类型的容器,在这个接口中需要包含抽象方法的定义,看这个接口

 

   public interface IMinContainer:IDisposable
    {
        void RegisterType(Type TFrom, Type Tto);
        
        object Resolve(Type t);

        TType Resolve<TType>();
    }


 

 

  • 实现接口

 

接下来就是实现这个接口,

 

public   class MinContainer:IMinContainer
    {
       private bool disposed;

       private readonly Dictionary<Type, TypeKeys> _regkey =
           new Dictionary<Type, TypeKeys>();
 
        #region IMinContainer Members

       public void RegisterType(Type TFrom, Type Tto) 
        {

            TypeKeys tk = new TypeKeys() { minType = TFrom, minInstance = CreateInstance(Tto) };
           if (!_regkey.ContainsKey(TFrom))
            _regkey.Add(TFrom, tk);

        }

        
        public object Resolve(Type t)
        {     
            if(_regkey.ContainsKey(t))
                return GetInstance(_regkey[t]);

            throw new Exception("Type not registered" + t);
        }
        public TType Resolve<TType>()
        {
            return (TType)Resolve(typeof(TType));
        }...

 

 

这里需要一个字典类型的集合器来保持注册的对象

 

  public class TypeKeys
    {

        public Type minType { get; set; }
        public object minInstance { get; set; }//类型实例

    }

CreateInstance方法是创建对象的实例

 

 

 private object CreateInstance(Type t)
        {
            var ctor = t.GetConstructors().First();
            var parameters = ctor.GetParameters().Select(p => Resolve(p.ParameterType)).ToArray();
            return ctor.Invoke(parameters);
        }

在Resolve方法中GetInstance方法实现如下,主要是从字典中获取实例。

 

 

private object GetInstance(TypeKeys typekey)
        {
            return typekey.minInstance ?? 
                (typekey.minInstance = CreateInstance(typekey.minType));
        }

 

 

  • 测试

 

好了,至此简单的原理级别的代码完成,测试。

 

 

在控制台中进行测试:

 

 

 

 

  • 小结:

 

以上代码只是很简陋的原理实现,需要完善泛型实现,生命周期管理等,不过也很简单,大家可以到codeplex站点下载Unit, Munq等实现框架代码。

 

 

 

分享到:
评论

相关推荐

    依赖注入实现,及IOC容器Unity的小Demo

    在.NET开发中,Unity是一个常用的IOC(Inversion of Control,控制反转)容器,它可以帮助我们实现依赖注入。 首先,让我们了解依赖注入的三种主要方式: 1. 构造函数注入:这是最常见的注入方式,通过在类的构造...

    Unity Ioc Container 实例

    依赖注入是设计模式的一种,其核心思想是将组件间的依赖关系解耦,由外部容器负责管理这些依赖,而不是由组件自己来创建和查找依赖。这使得代码更易于测试和维护,因为每个组件只需要关注自己的职责,而不需要关心...

    依赖注入那些事儿

    在依赖注入容器中,反射通常用于动态创建依赖对象并注入到目标对象中。 ##### 3.3 多态的活性与依赖注入 多态性是面向对象编程中的一个重要概念,指的是父类引用可以指向子类对象。依赖注入可以与多态性相结合,...

    c# 实现的简单的 注入容器

    在软件开发中,依赖注入(Dependency Injection,简称DI)是一种设计模式,用于降低代码之间的耦合,提高可测试性和可维护性。控制反转(Inversion of Control,简称IOC)是DI的核心理念,它将对象之间的依赖关系从...

    QuteContainer:C ++ Qt框架的IoC和依赖注入容器-开源

    QuteContainer是用于依赖项注入的轻型控制反转(IOC)容器。 QuteContainer使用C ++ Qt框架构建并用于C ++ Qt框架。 QuteContainer可以使用构造函数参数注入来自动解析对象依赖树。

    mvc4 ioc 依赖注入简单示例实现

    在ASP.NET MVC4中,Unity是一个流行的IoC容器,它提供了强大的依赖注入功能。Unity允许我们注册类型映射,然后在需要时自动提供依赖实例。下面我们将分步骤解释如何使用Unity进行依赖注入: 1. **安装Unity**:首先...

    ASP.NET MVC4中使用Unity Ioc Container 实例

    Unity IoC Container是Microsoft提供的一款轻量级的依赖注入容器,它可以帮助我们管理对象的生命周期,方便地注入依赖。 在这个实例中,我们将探讨如何在ASP.NET MVC4项目中集成Unity IoC Container,并使用它来...

    IoCContainer:依赖注入

    依赖注入通过将依赖的创建和管理转移到一个外部容器(IoC容器)来解决这个问题。在Swift中,我们可以自定义一个简单的IoC容器,或者使用现成的库如Swinject、Koin等。以下是一个简单的IoC容器实现示例: ```swift ...

    IOC容器 mini-container

    **IOC容器 mini-container** IOC(Inversion of Control)即控制反转,是软件设计模式中的一种,它将对象的创建和管理权交给了外部容器,而不是由对象自身来负责。这样可以降低代码之间的耦合度,提高系统的可扩展...

    PHP进阶学习之依赖注入与Ioc容器详解

    依赖注入容器(IoC容器)是实现依赖注入的一种机制,它可以自动地为我们管理依赖对象的生命周期,从而简化了依赖注入的实现。在实际应用中,如果类的数量和依赖关系较为复杂,重复编写依赖注入代码会非常繁琐,这时...

    自己实现IOC容器

    #### 2.5 实现依赖注入 最后,我们需要处理Bean间的依赖关系。这可以通过在Bean工厂中增加一个方法,遍历所有Bean,查找并注入它们的依赖。 ```java public void injectDependencies() { for (String beanId : ...

    IOC容器简单实现

    实际应用中的IOC容器会更复杂,包括支持更多类型的依赖注入(如属性注入、方法注入)、循环依赖的处理、支持接口绑定等。例如,Spring框架提供了XML和注解两种方式定义bean,还有强大的AOP(面向切面编程)支持,...

    生动讲解依赖注入

    通过反射,可以动态地创建对象和调用方法,这对于依赖注入容器管理对象的创建和注入非常有用。 ##### 多态的活性与依赖注入 - **多态性的活性**:多态允许我们使用父类的引用指向子类的对象。这意味着我们可以将...

    什么是依赖注入——本文作者的思想太经典了

    依赖注入模式解决了这个问题,通过引入一个第三方的组件,即依赖注入容器(IoC Container),来管理组件之间的依赖关系。依赖注入容器负责提供依赖项,并将其注入到需要它们的组件中。这样,组件之间的依赖关系变得...

    自己的代码模拟spring的依赖注入

    依赖注入意味着组件不直接创建其依赖的对象,而是由外部实体(如Spring IoC容器)提供。这样做的好处是,我们可以轻松地替换或更改依赖,而无需修改组件的源代码,符合开闭原则。 要模拟Spring的IoC,我们需要以下...

    php 实现IOC set 注入

    总结起来,PHP 中的 IOC 通过将对象的创建和依赖关系管理交给专门的容器来实现,而 set 注入是依赖注入的一种方式,允许我们在运行时通过 setter 方法将依赖注入到对象中。这种方式有助于提高代码的灵活性,降低耦合...

    An_IoC_Container_in_15_min

    2. **依赖注入(Dependency Injection, DI):** IoC的一个常见实现方式就是依赖注入,通过容器来管理和提供对象的依赖关系,而不是让对象自己去查找和创建依赖。 3. **IoC容器的作用:** IoC容器负责创建对象、...

    Unity的依赖注入

    Unity容器是微软提供的一个轻量级的依赖注入容器,它能够帮助开发者管理和配置应用程序中的依赖关系。Unity容器不仅支持构造函数注入、属性注入和方法注入,还提供了强大的生命周期管理功能,如单例模式、每个请求...

    Delphi下的轻量级IoC容器 - Elite Container (Demo 0.1版)

    相比Spring的对象容器,它提供的功能更为精简常用(如对象延迟创建、对象属性自动注入等),降低了学习的难度,并且提供了很多扩展点,你只需简单地写一个插件实现类,并在配置文件中进行简单配置,就可以让Elite ...

    【ASP.NET编程知识】ASP.NET MVC实现依赖注入的完整过程.docx

    2. 实现 IOC 容器:IOC 容器(Inversion of Control Container)是依赖注入的核心组件,负责管理和提供对象实例。在 ASP.NET MVC 中,可以使用开源框架 AutoFac 等,也可以自己实现一个轻量级的 IOC 容器。 3. 标记...

Global site tag (gtag.js) - Google Analytics