依赖注入DI(IOC)容器快速入门
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)容器快速入门的更多相关文章
- Castle IOC容器快速入门
主要内容 1.为什么要IOC 2.什么是Castle IOC容器 3.快速入门示例 4.几个重要的概念 一,为什么要IOC IOC(控制反转或者叫依赖注入)Martin Fowler大师在他的文章中已 ...
- Atitit js中的依赖注入di ioc的实现
Atitit js中的依赖注入di ioc的实现 全类名(FQCN)为标识符1 混合请求模式1 使用类内 builder 即可..2 Service locator method走ok拦2 Jav ...
- C#中的依赖注入和IoC容器
在本文中,我们将通过用C#重构一个非常简单的代码示例来解释依赖注入和IoC容器. 简介: 依赖注入和IoC乍一看可能相当复杂,但它们非常容易学习和理解. 在本文中,我们将通过在C#中重构一个非常简单的 ...
- 理解PHP 依赖注入|Laravel IoC容器
看Laravel的IoC容器文档只是介绍实例,但是没有说原理,之前用MVC框架都没有在意这个概念,无意中在phalcon的文档中看到这个详细的介绍,感觉豁然开朗,复制粘贴过来,主要是好久没有写东西了, ...
- 【转】理解 PHP 依赖注入 | Laravel IoC容器
Laravel框架的依赖注入确实很强大,并且通过容器实现依赖注入可以有选择性的加载需要的服务,减少初始化框架的开销,下面是我在网上看到的一个帖子,写的很好拿来与大家分享,文章从开始按照传统的类设计数据 ...
- spring的依赖注入DI(IOC)
1.手动注入 (1)set注入 public class UserService { private UserDao userDao; public void setUserDao(UserDao d ...
- 【转载】浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)
原文地址 http://blog.csdn.net/briblue/article/details/75093382 写这篇文章的原因是这两天在编写关于 Dagger2 主题的博文时,花了大量的精力来 ...
- 依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)
原文: https://blog.csdn.net/briblue/article/details/75093382 写这篇文章的原因是这两天在编写关于 Dagger2 主题的博文时,花了大量的精力来 ...
- 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。
轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战 ...
- Spring框架学习笔记(1)——控制反转IOC与依赖注入DI
Spring框架的主要作用,就是提供了一个容器,使用该容器就可以创建并管理对象.比如说Dao类等,又或者是具有多依赖关系的类(Student类中包含有Teacher类的成员变量) Spring有两个核 ...
随机推荐
- Java NIO:通道
最近打算把Java网络编程相关的知识深入一下(IO.NIO.Socket编程.Netty) Java NIO主要需要理解缓冲区.通道.选择器三个核心概念,作为对Java I/O的补充, 以提升大批量数 ...
- kubernetes-介绍与特性
1. kubernetes概述 1) kubernetes是什么 2) kubernetes能做什么 3) kubernetes特性 4) kubernetes集群架构与组件 5) kubernete ...
- C++调用全局函数与类成员函数
void testfunc(void *param) { printf("\n\tcall global function %s\n", param); } void *GetCl ...
- MySQL - 常用三种数据库存储引擎
数据库存储引擎:是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以获得特 ...
- 在linux下搭建l2tp隧道
搭一个l2tp隧道,拓扑如下 两台机器是CentOS5,内核选上CONFIG_LEGACY_PTYS选项后自己编译的,l2tp是已经停更的l2tpd-0.69.先在LS上配置IP地址,iptables ...
- 多测师讲解python _函数的传递_高级讲师肖sir
题目: 要求1.通过函数来实现 2.引用函数传递方法 3.引用返回值 有一个登录系统:账号admin 密码123456 验证码abc123 账号.密码.验证码 ...
- 多测师讲解pthon _函数__return_高级讲师肖sir
#函数中的返回的作用(return) 案例: #函数中的返回的作用:def fun(): #定义的一个函数 num =100 a=num/2 #print(a) #50.0 return a # pr ...
- js实现自定义弹窗
众所周知,浏览器自带的原生弹窗很不美观,而且功能比较单一,绝大部分时候我们都会按照设计图自定义弹窗或者直接使用注入layer的弹窗等等.前段时间在慕课网上看到了一个自定义弹窗的实现,自己顺便就学习尝试 ...
- PHP SPL标准库-迭代器
通过某种统一的方式遍历链表或者数组中的元素的过程叫做迭代遍历,这种统一的遍历工具我们叫做迭代器. PHP中迭代器是通过Iterator 接口定义的. ArrayIterator迭代器 foreach ...
- vue渐进式开发的理解和指令
1.vue渐进式开发 vue是一个渐进式的框架,轻量,易于上手,为啥是渐进式那,我当时也很蒙,比如的官网是jquery写的,就可以通过script标签引入事先准备好的vue.min.js的压缩源代码或 ...