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]使用Dagger 2依赖注入 - DI介绍(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5092083.html 使用Dagger 2依赖注入 - DI介 ...
- GsonFormat插件从配置到使用
说明:目前多数服务器端都以json格式返回,那么相对应的解析时建立的实体类如果你还在自己挨个写的话,那就out了.新建一个类,选择Generate. ------------------------- ...
- JS 与OC 交互篇
完美记录交互 CSDN博客: (OC调用JS) http://blog.csdn.net/lwjok2007/article/details/47058101 (JS调用OC) http://blog ...
- MySQL函数
MySQL数据库提供了很多函数包括: 数学函数: 字符串函数: 日期和时间函数: 条件判断函数: 系统信息函数: 加密函数: 格式化函数: 一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ...
- 树莓派3B更新软件
因为软件是要不断更新的,所以半个月或者一个月要升级一下软件 升级软件非常简单 在终端或者SSH里输入 sudo apt-get update && apt-get upgrade -y ...
- Arduino舵机控制
普通舵机有3根线:GND(黑).VCC(红).Signal(黄) 红色的是电源正极,黑色的是电源负极,白色的是信号线.有些舵机线是红棕橘三色,分别对应红黑白. #include <Servo.h ...
- Python任务调度模块 – APScheduler
APScheduler是一个Python定时任务框架,使用起来十分方便.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以持久化任务.并以daemon方式运行应用.目前最新版本为3.0 ...
- js判断用户是否正在滚动滚动条,滚动条滚动是否停止
js智能判断是否可以自动滚动 比如,做一个音乐播放器,边播放,边定位歌词,播放的时候,需要自动定位到播放语句,但是用户去拖动或者滚动div(歌词面板)时,这时就必须停止自动滚动,或者说是不能自动滚动, ...
- uva 129 krypton factors ——yhx
Krypton Factor You have been employed by the organisers of a Super Krypton Factor Contest in which ...
- There is no getter for property named 'useName' in 'class cn.itcast.mybatis.pojo.User'
org.apache.ibatis.exceptions.PersistenceException: ### Error updating database. Cause: org.apache.i ...