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组用 ...
随机推荐
- MySQL 数据还原
1.1还原使用mysqldump命令备份的数据库的语法如下: mysql -u root -p [dbname] < backup.sq 示例: mysql -u root -p < C: ...
- OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)
摘要 本文先给出一个看似很简单实则有深意的Java笔试面试题,引出JDK内部的缓存. JDK内部的缓存,主要是为了提高Java程序的性能. 你能答对这道"看似简单,实则有深意"的J ...
- 洛谷—— P2896 [USACO08FEB]一起吃饭Eating Together
https://www.luogu.org/problem/show?pid=2896 题目描述 The cows are so very silly about their dinner partn ...
- Effective C++ 11-17
11.为须要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符. 显然,由于动态内存分配,绝对会有深浅拷贝的问题,要重写拷贝构造函数.使其为深拷贝,才干实现真正意义上的拷贝.这是我理解的关于要声明拷 ...
- IntelliJ IDEA 进行Maven项目创建build
IntelliJ IDEA 进行Maven项目创建build 1,文件-新建-maven 项目:2,编写pom.xml文件:3,鼠标放到左下,然后选择Maven Projects,然后可以查看项目信息 ...
- Android 获取麦克风的音量(分贝)
基础知识 度量声音强度.大家最熟悉的单位就是分贝(decibel,缩写为dB).这是一个无纲量的相对单位.计算公式例如以下: 分子是測量值的声压,分母是參考值的声压(20微帕.人类所能听到的最小声压) ...
- [读书]Python学习手冊--属性管理1
属性管理-特性 一般开发这不必关心属性的实现.对工具的构建这来说,了解这一块对API的灵活性有帮助. 大多数情况下,属性位于对象自身之中.或者继承自对象所派生自的一个类. ----python学习手冊 ...
- linux 流量统计小程序
源代码例如以下: //2015/7/2 10:30:35 //gino #include <stdio.h> #include <sys/stat.h> #include &l ...
- 【CTO辩论会】移动开发人员忠于技术or 背离技术
第一期CTO辩论会结束后,大家在微信群中讨论,学什么编程语言好.有位官人直呼"劳力者治于人,苦差,不学也罢". 在IT.科技变革世界的今天,移动开发人员成为一个很时髦的工种. 就连 ...
- zzulioj--1804--ZY学长的密码(字符串)
1804: ZY学长的密码 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 140 Solved: 53 SubmitStatusWeb Board ...