Unity(IoC)
一、什么是IoC?
IoC(Inversion of Control,控制反转)又称“依赖注入”(Dependence Injection,DI)。
控制反转就是创建对象的权利由开发人员控制,转为由容器来控制。
依赖注入就是通过容器创建对象的,是通过在构造方法的参数,属性设置和接口等方式注入的。
IoC的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件(或程序)中描述创建关系,容器负责将它们联系起来。
二、什么是Unity?
Unity是微软开发的一款轻量级、可扩展的IoC框架,可通过代码或者XML配置文件的形式来配置对象和对象直接的关系。
在运行时直接调用容器即可获得我们需要的对象,以便建立松耦合的程序。
三、创建Unity Demo
1.新建控制台项目UnityDemo
2.右键UnityDemo项目,选择“管理NuGet程序包”,安装Unity程序包

3.新建几个接口IPhone,IHeadphone,IMicrophone,IPower
public interface IHeadphone
{ }
public interface IMicrophone
{ }
public interface IPower
{ }
public interface IPhone
{
/// <summary>
/// 打电话
/// </summary>
void Call(); IMicrophone iMicrophone { get; set; }
IHeadphone iHeadphone { get; set; }
IPower iPower { get; set; }
}
4.新建继承接口的类
public class Headphone:IHeadphone
{ }
public class Microphone: IMicrophone
{
} public class Power:IPower
{
} public class AndroidPhone : IPhone
{
public IHeadphone iHeadphone { get; set; } public IMicrophone iMicrophone { get; set; } public IPower iPower { get; set; } public AndroidPhone()
{
Console.WriteLine("{0}构造函数", this.GetType().Name);
} public void Call()
{
Console.WriteLine("{0}打电话", this.GetType().Name);
}
} public class ApplePhone : IPhone
{
[Dependency] //属性注入
public IHeadphone iHeadphone { get; set; } public IMicrophone iMicrophone { get; set; } public IPower iPower { get; set; } public ApplePhone()
{
Console.WriteLine("{0}构造函数", this.GetType().Name);
} [InjectionConstructor] //构造函数注入
public ApplePhone(IMicrophone iMicrophone)
{
this.iMicrophone = iMicrophone; Console.WriteLine("{0}带参数构造函数", this.GetType().Name);
} public void Call()
{
Console.WriteLine("{0}打电话", this.GetType().Name);
} [InjectionMethod] //属性注入
public void Init(IPower iPower)
{
this.iPower = iPower;
}
}
四、编程方式注册对应关系
Unity有三种注入方式:1.属性注入,使用[Dependency]特性 2.构造方法注入,使用[InjectionConstructor]特性(没有此特性,默认使用参数最多的构造方法) 3.方法注入,使用[InjectionMethod]特性
1.创建一个UnityContainer对象
2.通过UnityContainer对象的RegisterType方法来注册对象和对象之间的关系
3.通过UnityContainer对象的Resolve方法来获取指定对象关联的对象
static void Main(string[] args)
{
try
{
Console.WriteLine("********************AndroidPhone**********************");
{
IUnityContainer container = new UnityContainer();
container.RegisterType<IPhone, AndroidPhone>();
container.RegisterType<IHeadphone, Headphone>();
container.RegisterType<IMicrophone, Microphone>();
container.RegisterType<IPower, Power>();
IPhone phone = container.Resolve<IPhone>();
phone.Call();
//未注入 iHeadphone,iMicrophone,iPower 对象都为空
Console.WriteLine("phone.iHeadphone == null? {0}", phone.iHeadphone == null);
Console.WriteLine("phone.iMicrophone == null? {0}", phone.iMicrophone == null);
Console.WriteLine("phone.iPower == null? {0}", phone.iPower == null);
} Console.WriteLine("********************ApplePhone**********************");
{
IUnityContainer container = new UnityContainer();
container.RegisterType<IPhone, ApplePhone>();
container.RegisterType<IHeadphone, Headphone>();
container.RegisterType<IMicrophone, Microphone>();
container.RegisterType<IPower, Power>();
IPhone phone = container.Resolve<IPhone>();
phone.Call();
//通过属性注入,构造函数注入,方法注入 iHeadphone,iMicrophone,iPower 对象不为空
Console.WriteLine("phone.iHeadphone == null? {0}", phone.iHeadphone == null);
Console.WriteLine("phone.iMicrophone == null? {0}", phone.iMicrophone == null);
Console.WriteLine("phone.iPower == null? {0}", phone.iPower == null);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
运行结果:

五、通过配置文件配置对应关系
项目结构:

配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
</configSections>
<unity>
<!--定义别名-->
<aliases>
<add alias="IPhone" type="UnityDemo.Interface.IPhone,UnityDemo" />
<add alias="IHeadphone" type="UnityDemo.Interface.IHeadphone,UnityDemo" />
<add alias="IMicrophone" type="UnityDemo.Interface.IMicrophone,UnityDemo" />
<add alias="IPower" type="UnityDemo.Interface.IPower,UnityDemo" /> <add alias="AndroidPhone" type="UnityDemo.Service.AndroidPhone,UnityDemo" />
<add alias="ApplePhone" type="UnityDemo.Service.ApplePhone,UnityDemo" />
<add alias="Headphone" type="UnityDemo.Service.Headphone,UnityDemo" />
<add alias="Microphone" type="UnityDemo.Service.Microphone,UnityDemo" />
<add alias="Power" type="UnityDemo.Service.Power,UnityDemo" />
</aliases>
<!--容器-->
<container name="MyContainer">
<!--映射关系-->
<register type="IPhone" mapTo="ApplePhone"/>
<register type="IHeadphone" mapTo="Headphone"/>
<register type="IMicrophone" mapTo="Microphone"/>
<register type="IPower" mapTo="Power"/>
</container>
</unity>
</configuration>
调用代码:
public static void ContainerConfiguration()
{
IUnityContainer container = new UnityContainer();
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap { ExeConfigFilename ="Unity.config"};
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
UnityConfigurationSection section =(UnityConfigurationSection)configuration.GetSection("unity");
container.LoadConfiguration(section, "MyContainer");
IPhone phone = container.Resolve<IPhone>();
phone.Call();
//通过属性注入,构造函数注入,方法注入 iHeadphone,iMicrophone,iPower 对象不为空
Console.WriteLine("phone.iHeadphone == null? {0}", phone.iHeadphone == null);
Console.WriteLine("phone.iMicrophone == null? {0}", phone.iMicrophone == null);
Console.WriteLine("phone.iPower == null? {0}", phone.iPower == null);
}
Unity(IoC)的更多相关文章
- 总结Unity IOC容器通过配置实现类型映射的几种基本使用方法
网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下: unityContainer = new Un ...
- MVC中使用Unity Ioc Container
ASP.NET MVC中使用Unity Ioc Container 写在前面 安装Unity 添加服务层 IArticleRepository类型映射 服务注入到控制器 Global.asax初始 ...
- Unity IOC容器通过配置实现类型映射的几种基本使用方法
网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下 unityContainer = new Uni ...
- .NET Unity IOC框架使用实例
1.IOC简介 IOC(Inversion of Control), 控制反转 DI (Dependency Injection),依赖注入 IOC的基本概念是:不创建对象,但是描述创建它们的方式.在 ...
- 今天研究Unity Ioc 框架
今天研究Unity Ioc 框架,被自己坑了两个多小时. 运行就报错,反反复复检查了很多次,配置文件,代码都没有问题,也从新写了好几遍. 最后仔细看报错消息才知道,config文件没有生成到目录……… ...
- Unity Ioc 依赖倒置及Untity AOP被动拦截/自动拦截
各位博友金安,首先声明这是一篇转载的博客,原文链接:https://www.cnblogs.com/scottpei/archive/2013/01/08/2851087.html 十年河东,十年河西 ...
- 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入
前言:在C/S架构上,WPF无疑已经是"桌面一霸"了.在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用.但是WPF也有很多年的历史了,并且基于MVVM ...
- ASP.NET MVC中使用Unity Ioc Container
写在前面 安装Unity 添加服务层 IArticleRepository类型映射 服务注入到控制器 Global.asax初始化 后记 关于Unity的使用可以参照<Unity依赖注入使用详解 ...
- Unity IOC简单认知
看了不少IOC的文章.简单概念梳理下. 1.依赖,依赖倒置,控制反转(IOC),依赖注入 解释是仿照http://www.cnblogs.com/qqlin/archive/2012/10/09/27 ...
- Unity IOC容器的简单应用(转)
转自:http://blog.csdn.net/wanzhuan2010/article/details/7763280 Unity是Unity是微软patterns& practices组用 ...
随机推荐
- HDU-1083 Courses 二分图 最大匹配
题目链接:https://cn.vjudge.net/problem/HDU-1083 题意 有一些学生,有一些课程 给出哪些学生可以学哪些课程,每个学生可以选多课,但只能做一个课程的代表 问所有课能 ...
- mybatis中 #跟$的区别
#相当于对数据 加上 双引号,$相当于直接显示数据 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sq ...
- 平衡二叉树(AVLTREE,双链表实现)
首先说下好久没更新了,最近打游戏和工作都有点多,o(^▽^)o. 写这个AVL发现自己的代码风格好差,尤其是变量命名这块,后来意识到了,想去改,但是太多了,改了几个就不想改了,做这个是记录下自己的成长 ...
- 《从零開始学Swift》学习笔记(Day 51)——扩展构造函数
创文章.欢迎转载.转载请注明:关东升的博客 扩展类型的时候,也能够加入新的构造函数.值类型与引用类型扩展有所差别.值类型包含了除类以外的其它类型.主要是枚举类型和结构体类型. 值类型扩展构造函数 扩展 ...
- CF 558D(Guess Your Way Out! II-set解决区间问题)
D. Guess Your Way Out! II time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- jsp页面中自定义标签的小演示
在实习期遇到公司的pg自定义标签了,同事要我自己自学一下 自定义标签是用户定义的JSP语言元素.当JSP页面包含一个自定义标签时将被转化为servlet.JSP标签扩展可以让你创建新的标签并且可以直接 ...
- 构造函数的理解(构造函数与 init 方法)
0. 构造函数与 init 方法 构造方法内部禁止添加任何业务逻辑,如果有业务逻辑,请放在 init 方法中: 1. 构造函数的参数 以下为一个堆实现优先队列(堆的实现借助完全二叉树,而完全二叉树又可 ...
- MailKit和MimeKit的.NET基础邮件服务
MailKit和MimeKit的.NET基础邮件服务 邮件服务是一般的系统都会拥有和需要的功能,但是对于.NET项目来说,邮件服务的创建和使用会较为的麻烦..NET对于邮件功能提供了System.Ne ...
- String slices
String slices A segment of a string is called a slice. Selecting a slice is similar selecting a char ...
- linux中不同颜色的文件代表什么不同的类型
linux 文件颜色的含义,蓝色代表目录,绿色代表可执行文件,红色表示压缩文件,浅蓝色表示链接文件,灰色表示其他文件,红色闪烁表示链接的文件有问题了,黄色表示设备文件.蓝色文件----------目. ...