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组用 ...
随机推荐
- java jar打包命令使用
用法:jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ... 选项: -c 创建新的存档 -t 列出存档内容的列表 -x 展开存档中的命名的 ...
- HISTFILESIZE与HISTSIZE的区别
在linux系统中,history命令可以输出历史命令,历史命令默认保存在文件~/.bash_history中. HISTFILESIZE 与 HISTSIZE都是history命令需要用到的两个sh ...
- caioj 1155 同余方程组(模版)
第一步,和同余方程一样,转化一下 两式相减得 这就转化为了求不定方程,用exgcd 求出x,要化成最小正整数解,避免溢出 然后可以求出P出来. 这个时候要把前两个式子转化成一个式子 设求出来的是P' ...
- Maven copy方式列举
maven copy有很多种方法: 1.maven-antrun-plugin (使用ant复制) <build> <finalName>flex</finalName& ...
- docker mysql 文件挂载和MySQL字符集设置
原文:docker mysql 文件挂载和MySQL字符集设置 docker run -p 3306:3306 --name mysql -v /usr/local/mysql/my.cnf:/etc ...
- 【BZOJ 1179】[Apio2009]Atm
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] tarjan强连通缩点一下. 然后把缩点之后,每个点的钱的数累加起来. 然后从S出发 开始一边做bfs一遍做dp. 最后输出有酒吧的 ...
- 【BZOJ 1293】[SCOI2009]生日礼物
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然的滑动窗口题. (尺取法 如果l..i这一段已经有k种珍珠了. 那么就尝试把l++; (即把l这个影响尝试去掉一下 如果不足k种 ...
- 集团公司(嵌入ETL工具)財务报表系统解决方式
集团公司(嵌入ETL工具)財务报表系统解决方式 一.项目背景: 某集团公司是一家拥有100多家子公司的大型集团公司,旗下子公司涉及各行各业,包含:金矿.铜矿.房产.化纤等.因为子公司在业务上的差异.子 ...
- Trustie站点代码托管使用指南
"中国人的github"猛击Trustie官网,開始代码托管... 1. 新建项目 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...
- YTUOJ-计算该日在本年中是第几天(用户自己定义类型)
题目描写叙述 定义一个结构体变量(包含年.月.日).编写一个函数days,由主函数将年.月.日传递给函数days,计算出该日在本年中是第几天并将结果传回主函数输出. 输入 年月日 输出 当年第几天 例 ...