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的更多相关文章

  1. IOC : Unity 配置和使用

    原文出自:IOC : Unity 配置和使用 之前Terry Lee 已经介绍过Unity的简单使用了,不过那篇文章是针对旧版本的,现在的版本1.2版略有不同. 我下载了Unity并做了一个简单的测试 ...

  2. [IOC]Unity使用

    Unity是什么? unity是patterns&practices团队开发的一个轻量级.可扩展的依赖注入容器. Unity特性 1.它提供了创建(或者装配)对象实例的机制,而这些对象实例可能 ...

  3. .Net Ioc Unity

    Unity 的接口IUnityContainer public interface IUnityContainer : IDisposable IUnityContainer RegisterType ...

  4. .net web api ioc unity usage

    1.use nuget to install unity.webapi 2.add configurations in application_start folder using Microsoft ...

  5. .Net IOC 之Unity

    .Net IOC 之Unity 在码农的世界里,为了应付时常变更的客户需求,增加的架构的客扩展性,减少工作量.IOC诞生了,它是一种可以实现依赖注入和控制对象生命周期的容器.最为一个有节操.有追求的码 ...

  6. IOC容器:Unity

    一.什么是IOC 学习IOC之前先来了解一个依赖导致原则(DIP),依赖导致原则是IOC的核心原理. 依赖导致:即上层模块不应该依赖于低层模块,二者应该通过抽象来依赖.依赖于抽象,而不是依赖于细节. ...

  7. IOC的理解,整合AOP,解耦对Service层和Dal层的依赖

    DIP依赖倒置原则:系统架构时,高层模块不应该依赖于低层模块,二者通过抽象来依赖依赖抽象,而不是细节 贯彻依赖倒置原则,左边能抽象,右边实例化的时候不能直接用抽象,所以需要借助一个第三方 高层本来是依 ...

  8. 【Unity】微软的一款依赖注入组件

    前言 前面学习了autofac这个依赖注入组件,本来是打算写在一起的,因为这个组件没打算像autofac一样详细的写,只是写下以前自己鼓捣玩搭建框架然后使用的一个依赖注入组件,并且也是进行了封装使用. ...

  9. _appstart.cshtml,_pagestart.cshtml,_viewstart.cshtml

    ASP.NET MVC3 系列教程 – Web Pages 1.0 I:Web Pages 1.0中以"_"开头的特别文件(文件命名时不区分大小写) "_appstart ...

随机推荐

  1. xcode8.0升级之后公司项目遇到的问题

    xcode8升级之后项目遇到了问题,由于这个项目是我中途接手的,遇到的第三方也是自己没有用过的, AQGridViewCell,这个第三方的类主要是用于处理图片的问题,xcode开发工具升级过后,报这 ...

  2. [Bind(Exclude = "OrderId")][ScaffoldColumn(false)]

    [Bind(Exclude = "OrderId")] 的意思是:View里的Model,在你提交给 Action时,不会绑定到Action的参数Model,默认它会绑定. mvc ...

  3. JS 字符串

    var str = "aaddaabbcdddefg" console.log(str.charAt());//b 没有返回空不是null console.log(str.inde ...

  4. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

  5. 搭建SpringMVC+Spring+Hibernate平台

    一. 开发环境 1. 点击此查看并下载需要的 Eclipse IDE for Java EE Developers 开发工具,推荐选用32位   2. 点击此查看并下载需要的 MySQL Server ...

  6. windows下redis安装

    最近因公司项目原因,去了趟昆明出差,其中第一次接触安装redis,配置sentinel,学习到不少,但也都是皮毛而已,本随笔记下所学知识. 1.首先介绍下redis,来源自百度百科 redis是一个k ...

  7. [转]MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN

    本文转自:http://www.cnblogs.com/jesse2013/p/aspnet-identity-claims-based-authentication-and-owin.html 在M ...

  8. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  9. CANopen学习——感性认知

    看不懂的知识硬着头皮也要看.读了当时虽然不理解,但脑子里对其相关名词.概念有印象,继续看下去,多读几遍,一定会在某个地方顿悟.  CAN总线只是定义了物理层和数据链路层,并没有定义应用层.这么优秀的总 ...

  10. 《WePayUI组件设计的秘密》——2016年第一届前端体验大会分享

    本文是博主参加第一届前端体验大会 | 物勒工名做的分享<WePayUI组件设计的秘密>,内容主要分为2个部分: 一.浅析UI库/框架的未来 讨论的UI库或者框架,主要包含展示和交互的css ...