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组用 ...
随机推荐
- [AH2017/HNOI2017]影魔(主席树+单调栈)
设\(l[i]\)为i左边第一个比i大的数的下标.\(r[i]\)为i右边第一个比i大的数的下标. 我们把\(p1,p2\)分开考虑. 当产生贡献为\(p1\)时\(i\)和\(j\)一定满足,分别为 ...
- 简单编写makefile文件,实现GCC4.9编译项目,增加boost库測试等等。。
一.须要用到的hw.cpp hw.h funtest.cpp funtest.h makefile 几个測试文件 1.hw.cpp代码例如以下: #include "hw.h" # ...
- 纯CSS实现小圆点和三角形图案
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- ★★★【卡法 常用js库】: js汇合 表单验证 cookie设置 日期格式 电话手机号码 email 整数 小数 金额 检查参数长度
[卡法 常用js库]: js汇合 表单验证 cookie设置 日期格式 电话手机号码 email 整数 小数 金额 检查参数长度 // +---------------------- ...
- struts2 validate验证
转自:https://blog.csdn.net/houpengfei111/article/details/9038233 自定义拦截器 要自定义拦截器需要实现com.opensymphony.xw ...
- 32.智能指针auto_ptr
#include <iostream> #include <memory> #include <string> #include <vector> us ...
- java9新特性-13-增强的 Stream API
1.使用说明 Java 的 Steam API 是java标准库最好的改进之一,让开发者能够快速运算,从而能够有效的利用数据并行计算.Java 8 提供的 Steam 能够利用多核架构实现声明式的数据 ...
- P1452 Beauty Contes
题目背景 此处省略1W字^ ^ 题目描述 贝茜在牛的选美比赛中赢得了冠军”牛世界小姐”.因此,贝西会参观N(2 < = N < = 50000)个农场来传播善意.世界将被表示成一个二维平面 ...
- FlatternMap和Map的区别
flattenMap使用步骤: 1.传入一个block,block类型是返回值RACStream,参数value 2.参数value就是源信号的内容,拿到源信号的内容做处理 3 ...
- 函数式JS: 原来promise是这样的monad
转载请注明出处: http://hai.li/2017/03/27/prom... 背景 上篇文章 函数式JS: 一种continuation monad推导 得到了一个类似promise的链式调用, ...