1.什么是IOC

IOC是一种设计模式,全程控制翻转或叫依赖注入。更详细介绍见http://martinfowler.com/articles/injection.html

2.为什么用IOC

我们通常使用抽象接口来隔离使用者与具体实现之间的依赖关系。但是不管怎么抽象接口,最终接口都必须要创建具体的实现类实例。这种创建实对象的操作导致了对于具体实现的依赖。为了消除这种依赖,我们需要把依赖移除到程序外部。引入了IOC容器后,这些类完全基于抽象接口编写而成。一般有三种形式,1.构造函数注入,2.属性注入,3.接口注入

3.一个简单的IOC实例

下面通过Castle IOC容器做一个简单的示例说明

3.1 Castle IOC

Windsor是Castle的一个IOC容器,构建于MicroKernel,能检测并了解使用这些类时需要什么参数,检测类型和类型之间的工作依赖性。

3.2 简单实例

假设我们有一个开发日志组件需求,把日志信息输出到文本文件,同时对输出的信息进行格式化。

step1:新建工程添加dll引用

Castle.DynamicProxy.dll

Castle.MicroKernel.dll

Castle.Model.dll

Castle.Windsor.dll

step2:编写服务

日志组件,我们添加两个接口ILog和ILogFormatter,这样的接口也叫做服务(实现了某种服务的接口)

public interface ILog

{
void Write(string MsgStr);
}
public interface ILogFormatter

{
string Format(string MsgStr);
}

Step3:编写组件(接口实现)

public class TextFileLog : ILog

{
private string _target;
private ILogFormatter _format; public TextFileLog(string target,ILogFormatter format)
{
this._target = target;
this._format = format;
} public void Write(string MsgStr)
{
string _MsgStr = _format.Format(MsgStr);
_MsgStr += _target;
Console.WriteLine("Output "+_MsgStr);
}
}
public class TextFormatter : ILogFormatter
{
public TextFormatter()
{ } public string Format(string MsgStr)
{
return "[" + MsgStr + "]";
}
}

Step3:编写配置文件

在TextFileLog构造函数中需要ILogFormatter实例外,还需要指定信息的输出文本名,这里我们编写一个配置文件来指定

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<components>
<component id="txtLog">
<parameters>
<target>log.txt</target>
</parameters>
</component>
</components>
</configuration>

Step4:使用IOC容器

前面都是小菜,下面开始正式使用了。建立容器,加入组件,获取组件,使用组件。

public class App
{
public static void Main()
{
//建立容器
IWindsorContainer container = new WindsorContainer(); //加入组件
container.AddComponent( "txtLog",
typeof(ILog), typeof(TextFileLog) ); container.AddComponent( "format",
typeof(ILogFormatter), typeof(TextFormatter) ); //获取组件
ILog log = (ILog) container["txtLog"]; //使用组件
log.Write("First Castle IOC Demo"); Console.ReadLine();
}
}
  • 注册一个Windsor容器
  • 向容器中注册ILog服务服务,并告知容器TextFileLog实现了这个服务。为了方便我们还设置了一个key参数,后面直接通过key来获取服务。
  • 注册ILog时容器会发现这个服务依赖于其他服务,自动寻找。
  • 向容器中注册ILogFormatter并告知TextFormatter实现了它。
  • 容器发现类的构造函数还需要target参数,指定去xml中查找。

参考资料

Castle的官方网站http://www.castleproject.org

依赖注入DI(IOC)容器快速入门的更多相关文章

  1. Castle IOC容器快速入门

    主要内容 1.为什么要IOC 2.什么是Castle IOC容器 3.快速入门示例 4.几个重要的概念 一,为什么要IOC IOC(控制反转或者叫依赖注入)Martin Fowler大师在他的文章中已 ...

  2. Atitit js中的依赖注入di ioc的实现

    Atitit js中的依赖注入di ioc的实现 全类名(FQCN)为标识符1 混合请求模式1 使用类内  builder  即可..2 Service locator method走ok拦2 Jav ...

  3. C#中的依赖注入和IoC容器

    在本文中,我们将通过用C#重构一个非常简单的代码示例来解释依赖注入和IoC容器. 简介: 依赖注入和IoC乍一看可能相当复杂,但它们非常容易学习和理解. 在本文中,我们将通过在C#中重构一个非常简单的 ...

  4. 理解PHP 依赖注入|Laravel IoC容器

    看Laravel的IoC容器文档只是介绍实例,但是没有说原理,之前用MVC框架都没有在意这个概念,无意中在phalcon的文档中看到这个详细的介绍,感觉豁然开朗,复制粘贴过来,主要是好久没有写东西了, ...

  5. 【转】理解 PHP 依赖注入 | Laravel IoC容器

    Laravel框架的依赖注入确实很强大,并且通过容器实现依赖注入可以有选择性的加载需要的服务,减少初始化框架的开销,下面是我在网上看到的一个帖子,写的很好拿来与大家分享,文章从开始按照传统的类设计数据 ...

  6. spring的依赖注入DI(IOC)

    1.手动注入 (1)set注入 public class UserService { private UserDao userDao; public void setUserDao(UserDao d ...

  7. 【转载】浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)

    原文地址 http://blog.csdn.net/briblue/article/details/75093382 写这篇文章的原因是这两天在编写关于 Dagger2 主题的博文时,花了大量的精力来 ...

  8. 依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)

    原文: https://blog.csdn.net/briblue/article/details/75093382 写这篇文章的原因是这两天在编写关于 Dagger2 主题的博文时,花了大量的精力来 ...

  9. 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。

    轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战   ...

  10. Spring框架学习笔记(1)——控制反转IOC与依赖注入DI

    Spring框架的主要作用,就是提供了一个容器,使用该容器就可以创建并管理对象.比如说Dao类等,又或者是具有多依赖关系的类(Student类中包含有Teacher类的成员变量) Spring有两个核 ...

随机推荐

  1. C# excel文件导入导出

    欢迎关注微信公众号 C#编程大全 这里有更多入门级实例帮你快速成长 在C#交流群里,看到很多小伙伴在excel数据导入导出到C#界面上存在疑惑,所以今天专门做了这个主题,希望大家有所收获! 环境:wi ...

  2. 玩转控件:GDI+动态绘制流程图

       前言 今天,要跟大家一起分享是"GDI+动态生成流程图"的功能.别看名字高大上(也就那样儿--!),其实就是动态生成控件,然后GDI+绘制直线连接控件罢了.实际项目效果图如下 ...

  3. javascript 原型与原型链浅析

    原型 和原型链 什么是原型链 简单理解就是原型组成的链,对象的__proto__它的是原型,而原型也是一个对象,也有__proto__属性,原型的__proto__又是原型的原型,就这样可以一直通过_ ...

  4. 浅谈Samsung Exynos4412处理器

    转载于:http://www.cnblogs.com/android210/archive/2013/01/16/2862349.html Topic:浅谈Samsung Exynos4412处理器( ...

  5. ztree通过ajax加载json数据中文乱码的解决方法:springmvc配置

    一.问题描述 使用zTree的异步刷新父级菜单时,服务器返回中文乱码,但项目中使用了SpringMvc,已经对中文乱码处理,为什么还会出现呢? 此处为的异步请求的配置: async: { enable ...

  6. 题解:[COCI2011-2012#5] BLOKOVI

    题解:[COCI2011-2012#5] BLOKOVI Description PDF : https://hsin.hr/coci/archive/2011_2012/contest5_tasks ...

  7. MeteoInfoLab脚本示例:站点填图

    打开包含站点填图的站点数据文件(比如micaps 1)之后,用文件对象的smodeldata函数获取StationModel数据对象,然后用stationmodel函数绘制站点填图图层.脚本程序: # ...

  8. day43 Pyhton 并发编程06

    一.内容回顾 线程 锁 为什么有了GIL之后还需要锁 多个线程同时操作全局变量还需要锁 当出现'非原子性操作',例如+= -= *= /= l.append(l) 原子性操作 a += 1  a= a ...

  9. 实现base64的编码解码,深刻理解base64

    上代码 #include<stdio.h> #include<string.h> #include<stdlib.h> const char padding = ' ...

  10. linux(centos8):安装java jdk 15 (java 15)

    一,下载jdk15 官方网站: https://www.oracle.com/java/ 下载页面: https://www.oracle.com/cn/java/technologies/javas ...