IOC Unity
1. 依赖倒置原则和IOC
2. IOC(Inversion of Control)的好处
3. 介绍和使用Unity
依赖倒置原则(DIP):上层和下层之间,依赖抽象,而不依赖细节
IOC 控制反转,把上端对下端细节的依赖,转移给第三方,上端只依赖抽象
Unity:就是一个第三方的容器
public static void Show()
{
{
Console.WriteLine("**************************普通用法*************************");
IPhone phone = new AndroidPhone();
phone.Call();
Console.WriteLine(" phone.Headphone==null? {0}", phone.Headphone == null);
Console.WriteLine("phone.Microphone==null? {0}", phone.Microphone == null);
Console.WriteLine(" phone.Power==null? {0}", phone.Power == null);
}
{
Console.WriteLine("*********************Iunity用法,无注入*******************");
IUnityContainer container = new UnityContainer();
container.RegisterType<IPhone, AndroidPhone>();
container.RegisterType<IMicrophone, Microphone>();
container.RegisterType<IHeadphone, Headphone>();
container.RegisterType<IPower, Power>();
IPhone phone = container.Resolve<IPhone>();
phone.Call();
Console.WriteLine(" phone.Headphone==null? {0}", phone.Headphone == null);
Console.WriteLine("phone.Microphone==null? {0}", phone.Microphone == null);
Console.WriteLine(" phone.Power==null? {0}", phone.Power == null);
}
{
Console.WriteLine("*********************Iunity用法,注入*******************");
IUnityContainer container = new UnityContainer();
container.RegisterType<IPhone, ApplePhone>();
container.RegisterType<IMicrophone , Microphone >();
container.RegisterType<IHeadphone , Headphone>();
container.RegisterType<IPower, Power>();
IPhone phone = container.Resolve<IPhone>();
phone.Call();
Console.WriteLine(" phone.Headphone==null? {0}", phone.Headphone == null);
Console.WriteLine("phone.Microphone==null? {0}", phone.Microphone == null);
Console.WriteLine(" phone.Power==null? {0}", phone.Power == null);
//IOC还可以做: 单例 单线程单例 AOP
}
}
三种注入方式
/// <summary>
/// 依赖注入三种方式:构造函数注入 属性注入 方法注入
/// </summary>
public class ApplePhone : IPhone
{
[Dependency] //属性注入
public IMicrophone Microphone { get; set; }
public IHeadphone Headphone { get; set; }
public IPower Power { get; set; }
public ApplePhone()
{
Console.WriteLine("{0}构造函数", this.GetType().Name);
} [InjectionConstructor ]//构造函数注入,可以不要特性,默认使用参数最多的构造函数
public ApplePhone (IHeadphone iHeadphone)
{
this.Headphone = iHeadphone;
Console.WriteLine("{0}带参数构造函数", this.GetType().Name);
}
public void Call()
{
Console.WriteLine("{0}打电话", this.GetType().Name);
} [InjectionMethod ]//方法注入:必须是public
public void Init(IPower power)
{
this.Power = power;
Console.WriteLine("初始化函数{0}", this.GetType().Name);
}
}
写配置文件
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity>
<containers>
<container name="testContainer">
<register type="IOCUnity.IPhone,IOCUnity" mapTo="IOCUnity.ApplePhone, IOCUnity"/>
<register type="IOCUnity.IMicrophone, IOCUnity" mapTo="IOCUnity.Microphone, IOCUnity"/>
<register type="IOCUnity.IHeadphone, IOCUnity" mapTo="IOCUnity.Headphone, IOCUnity"/>
<register type="IOCUnity.IPower, IOCUnity" mapTo="IOCUnity.Power, IOCUnity"/>
<register type="IOCUnity.IPhone,IOCUnity" mapTo="IOCUnity.AndroidPhone, IOCUnity" name="android"/>
<register type="IOCUnity.IPhone,IOCUnity" mapTo="IOCUnity.ApplePhone, IOCUnity" name="apple"/>
</container>
</containers>
</unity>
</configuration>
Unity的标准运用方式
public class UnityConfig
{
public static void Show()
{
IUnityContainer container = new UnityContainer();//准备容器 ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "CfgFiles\\Unity.Config.xml");//找配置文件的路径
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName); section.Configure(container, "testContainer");//注册 IPhone phone = container.Resolve<IPhone>(); //new AndroidPhone();//创建对象
phone.Call(); Console.WriteLine("****************************************");
IPhone phone2 = container.Resolve<IPhone>("apple"); //new AndroidPhone();//创建对象
phone2.Call();
Console.WriteLine("****************************************");
IPhone phone3 = container.Resolve<IPhone>("android"); //new AndroidPhone();//创建对象
phone3.Call();
}
IOC Unity的更多相关文章
- IOC : Unity 配置和使用
原文出自:IOC : Unity 配置和使用 之前Terry Lee 已经介绍过Unity的简单使用了,不过那篇文章是针对旧版本的,现在的版本1.2版略有不同. 我下载了Unity并做了一个简单的测试 ...
- [IOC]Unity使用
Unity是什么? unity是patterns&practices团队开发的一个轻量级.可扩展的依赖注入容器. Unity特性 1.它提供了创建(或者装配)对象实例的机制,而这些对象实例可能 ...
- .Net Ioc Unity
Unity 的接口IUnityContainer public interface IUnityContainer : IDisposable IUnityContainer RegisterType ...
- .net web api ioc unity usage
1.use nuget to install unity.webapi 2.add configurations in application_start folder using Microsoft ...
- .Net IOC 之Unity
.Net IOC 之Unity 在码农的世界里,为了应付时常变更的客户需求,增加的架构的客扩展性,减少工作量.IOC诞生了,它是一种可以实现依赖注入和控制对象生命周期的容器.最为一个有节操.有追求的码 ...
- IOC容器:Unity
一.什么是IOC 学习IOC之前先来了解一个依赖导致原则(DIP),依赖导致原则是IOC的核心原理. 依赖导致:即上层模块不应该依赖于低层模块,二者应该通过抽象来依赖.依赖于抽象,而不是依赖于细节. ...
- IOC的理解,整合AOP,解耦对Service层和Dal层的依赖
DIP依赖倒置原则:系统架构时,高层模块不应该依赖于低层模块,二者通过抽象来依赖依赖抽象,而不是细节 贯彻依赖倒置原则,左边能抽象,右边实例化的时候不能直接用抽象,所以需要借助一个第三方 高层本来是依 ...
- 【Unity】微软的一款依赖注入组件
前言 前面学习了autofac这个依赖注入组件,本来是打算写在一起的,因为这个组件没打算像autofac一样详细的写,只是写下以前自己鼓捣玩搭建框架然后使用的一个依赖注入组件,并且也是进行了封装使用. ...
- _appstart.cshtml,_pagestart.cshtml,_viewstart.cshtml
ASP.NET MVC3 系列教程 – Web Pages 1.0 I:Web Pages 1.0中以"_"开头的特别文件(文件命名时不区分大小写) "_appstart ...
随机推荐
- Android开发者的Kotlin:书
原文标题:Kotlin for Android Developers: The book 原文链接:http://antonioleiva.com/kotlin-android-developers/ ...
- iOS多线程之8.NSOPeration的其他用法
本文主要对NSOPeration的一些重点属性和方法做出介绍,以便大家可以更好的使用NSOPeration. 1.添加依赖 - (void)addDependency:(NSOperation * ...
- 如何安装Genymotion虚拟机以及Genmotion的eclipse插件
---内容开始--- - 首先去genymotion的官网去下载其安装文件 资源下载 Genymotion官网必须注册一个账号这个账号安装之后还有用的,用户名最好用网易126邮箱注册----我下载的是 ...
- 两listview联动
package com.mttz; import java.util.ArrayList;import java.util.List; import com.mttz.adapter.CaiDanAD ...
- 利用sphinx为python项目生成API文档
sphinx可以根据python的注释生成可以查找的api文档,简单记录了下步骤 1:安装 pip install -U Sphinx 2:在需要生成文档的.py文件目录下执行sphinx-apido ...
- Java中的关键字 transient
先解释下Java中的对象序列化 在讨论transient之前,有必要先搞清楚Java中序列化的含义: Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息 ...
- css实现网页表格
一. 准备工作 1. 点击此下载 相关文件 二. 在浏览器中运行 table.html 文件,即可看到效果 三. 效果图
- 无法安装Windows Live“OnCatalogResult:0x80190194”错误的解决方法
今天想安装一个博客客户端,结果安装一直报错"OnCatalogResult:0x80190194",百度查到了解决发放再此记录下来,以备后用. 到官网下载了一个在线安装程序,可是一 ...
- Execl数据导入sql server方法
在日常的程序开发过程中,很多情况下,用户单位给予开发人员的数据往往是execl或者是access数据,如何把这些数据转为企业级是数据库数据呢,下面就利用sqlserver自带的功能来完成此项任务. 首 ...
- (转)Java中的static关键字解析
转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ...