Unity依赖注入(笔记)
一.介绍
控制反转(Inversion of Control,简称IoC):整洁架构思想,不允许内部获知外部的存在,这就导致了我们必须在内层定义与外层交互的接口,通过依赖注入的方式将外层实现注入到内部来。
依赖注入(Dependency Injection,简称DI): 高层通过接口隔离具体实现的依赖,就意味着具体实现转移到了外部,究竟使用哪一个具体实现,由外部调用者来决定,只有在运行调用者代码时才将外面的依赖传递给高层。
依赖倒置原则(Dependency Inversion Principle,DIP) : 高层模块不应该依赖于底层模块,两者应该依赖于抽象。本质:我们要依赖不变或稳定的元素(类,模块或层),抽象不应该依赖细节,细节应该与抽象。
二.Unity使用介绍
使用Nuget包安装以下组件:
Unity : 5.8.6
Unity.Interception : 5.5.3
<!--Unity 配置文件-->
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
</configSections>
<unity>
<sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration"/>
<containers>
<container name="testContainer">
<register type="Interface.IPhone,Interface" mapTo="Services.AndroidPhone, Services" />
<register type="Interface.IPhone,Interface" mapTo="Services.TestPhone, Services" name="TestPhone"/>
</container>
</containers>
</unity>
</configuration>
<!--Unity 配置文件讲解-->
<unity>
<sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration"/>
<containers>
<container name="容器名称">
<register type="接口的命名空间(namespace).接口名,接口的命名空间" mapTo="实现类的命名空间.实现类名, 实现类的命名空间" />
<register type="Interface.IPhone,Interface" mapTo="Services.TestPhone, Services" name="TestPhone"/>
</container>
</containers>
</unity>
</configuration>
封装UnityIocHelper调用类:
using System;
using System.Configuration;
using System.IO;
using Microsoft.Practices.Unity.Configuration;
using Unity;
using Unity.Resolution; namespace MyIOC.Untiy
{
/// <summary>
/// 描 述:UnityIoc
/// </summary>
public class UnityIocHelper
{
#region 构造方法
/// <summary>
/// 构造方法
/// </summary>
/// <param name="containerName">容器名称</param>
private UnityIocHelper(string containerName)
{ ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "CfgFiles\\Unity.Config");//找配置文件的路径
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
//UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
// <unity configSource="Config\ioc.config" />
if (section.Containers.Count > 0)
{
_container = new UnityContainer();
section.Configure(_container, containerName);
}
}
#endregion #region 属性
/// <summary>
/// 容器
/// </summary>
private readonly IUnityContainer _container;
/// <summary>
/// 容器实例
/// </summary>
private static readonly UnityIocHelper instance = new UnityIocHelper("testContainer"); /// <summary>
/// UnityIoc容器实例
/// </summary>
public static UnityIocHelper Instance
{
get { return instance; }
} #endregion #region 获取对应接口的具体实现类
/// <summary>
/// 获取实现类(默认映射)
/// </summary>
/// <typeparam name="T">接口类型</typeparam>
/// <returns>接口</returns>
public T GetService<T>()
{
return _container.Resolve<T>();
}
/// <summary>
/// 获取实现类(默认映射)带参数的
/// </summary>
/// <typeparam name="T">接口类型</typeparam>
/// <param name="parameter">参数</param>
/// <returns>接口</returns>
public T GetService<T>(params ParameterOverride[] parameter)
{
return _container.Resolve<T>(parameter);
}
/// <summary>
/// 获取实现类(指定映射)带参数的
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="name"></param>
/// <param name="parameter"></param>
/// <returns>接口</returns>
public T GetService<T>(string name, params ParameterOverride[] parameter)
{
return _container.Resolve<T>(name, parameter);
}
#endregion #region 判断接口是否被注册了
/// <summary>
/// 判断接口是否被实现了
/// </summary>
/// <typeparam name="T">接口类型</typeparam>
/// <returns>bool</returns>
public bool IsResolve<T>()
{
return _container.IsRegistered<T>();
}
/// <summary>
/// 判断接口是否被实现了
/// </summary>
/// <typeparam name="T">接口类型</typeparam>
/// <param name="name">映射名称</param>
/// <returns></returns>
public bool IsResolve<T>(string name)
{
return _container.IsRegistered<T>(name);
}
#endregion
}
}
调用示例:
var android = UnityIocHelper.Instance.GetService<IPhone>();//不带参数,默认取容器的没用name的,但只能有一个,不然会异常.
android.Call();//AndroidPhone
var android = UnityIocHelper.Instance.GetService<IPhone>("TestPhone"); //取容器内名称匹配的.
android.Call();//TestPhone
三.Unity实现AOP
<!--Unity 配置文件-->
<container name="ContainerAOP">
<extension type="Interception"/>
<register type="Interface.IPhone,Interface" mapTo="Services.AndroidPhone, Services">
<interceptor type="InterfaceInterceptor"/>
<interceptionBehavior type="AOP.LogAfterBehavior,AOP"/>
<interceptionBehavior type="AOP.LogBeforeBehavior,AOP"/>
</register>
</container>
调用示例:
var androidAOP = UnityIocHelper.AOPInstance.GetService<IPhone>();//跟普通调用一样.
androidAOP.Call();
四.Unity实现单例
<container name="testContainer">
<register type="Interface.IPhone,Interface" mapTo="Services.AndroidPhone, Services" >
<lifetime type="singleton" />
</register>
</container>
五.源码下载:
https://github.com/gyw1309631798/MyIOC
Unity依赖注入(笔记)的更多相关文章
- Unity 依赖注入之二
1. 构造子注入 1.1 构造子注入初级代码 container.RegisterType<IMyWork, MyWork>(new InjectionConstructor(new Bo ...
- Unity依赖注入使用详解
写在前面 构造器注入 Dependency属性注入 InjectionMethod方法注入 非泛型注入 标识键 ContainerControlledLifetimeManager单例 Unity注册 ...
- WPF PRISM开发入门二(Unity依赖注入容器使用)
这篇博客将通过一个控制台程序简单了解下PRISM下Unity依赖注入容器的使用.我已经创建了一个例子,通过一个控制台程序进行加减乘除运算,项目当中将输入输出等都用接口封装后,结构如下: 当前代码可以点 ...
- C# Unity依赖注入
简介: 控制反转:我们向IOC容器发出获取一个对象实例的一个请求,IOC容器便把这个对象实例“注入”到我们的手中,在这个过程中你不是一个控制者而是一个请求者,依赖于容器提供给你的资源,控制权落到了容器 ...
- Unity 依赖注入
关于Ioc的框架有很多,比如astle Windsor.Unity.Spring.NET.StructureMap,我们这边使用微软提供的Unity做示例,你可以使用Nuget添加Unity,也可以引 ...
- c# Unity依赖注入WebService
1.IOC与DI简介 IOC全称是Inversion Of Control(控制反转),不是一种技术,只是一种思想,一个重要的面相对象编程的法则,它能知道我们如何设计出松耦合,更优良的程序.传统应用程 ...
- 使用Microsoft.Practices.Unity 依赖注入
Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...
- 使用Microsoft.Practices.Unity 依赖注入 转载https://www.cnblogs.com/slardar1978/p/4205394.html
Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(6)-Unity 依赖注入
系列目录 前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 本节重构一下代码,采用IOC控制反转,也就是依赖注入 您可以访问http://unity.codeplex.com/rel ...
随机推荐
- spring-boot-jpa 自定义查询工具类
1.pom文件中添加如下配置 <dependency> <groupId>org.springframework.boot</groupId> <artifa ...
- scala抽象类实战
实战一: 声明一个抽象类(SuperTeacher):(超级老师) abstract class SuperTeacher(val name : String){ var id : Int var a ...
- 归并排序(php实现)
<?php function mergeSort(&$arr){ $len = count($arr); msort($arr,0,$len-1); } function msort(& ...
- Android开发经验02:Android 项目开发流程
Android开发完整流程: 一.用户需求分析 用户需求分析占据整个APP开发流程中最重要的一个环节.一款APP开发的成功与否很大程度都决定于此.这里所说的用户需求分析指的是基于用户的要求所进行的 ...
- Spring Boot Mock单元测试学习总结
单元测试的方法有很多种,比如使用Postman.SoapUI等工具测试,当然,这里的测试,主要使用的是基于RESTful风格的SpringMVC的测试,我们可以测试完整的Spring MVC流程,即从 ...
- Day19 网络编程
基本概念 网络:一组由网线连接起来的计算机. 网络的作用: 1.信息共享. 2.信息传输. 3.分布式处理. 4.综合性的处理. internet:互联网 Internet:是互联网中最大的一个. w ...
- c++——const关键字
1 const基础知识(用法.含义.好处) int main() { const int a; int const b; const int *c; int * const d; const int ...
- 关于CodePlex
CodePlex是微软的开源工程网站,涉及诸多微软最新技术的开源工程. 网址:http://www.codeplex.com/ 应常去看看.
- css选择器,样式表导入
css笔记1.选择器(selecter)共9种 a.类型选择器 p{},body{} b.后代选择器 p h1{} c.ID选择 #idname{} d.类选择 .classname{} e.通用选择 ...
- iOS 倒计时的一种实现
1.view [self performSelectorInBackground:@selector(thread) withObject:nil]; - (void)thread { ;i>= ...