Unity

Unity是一个IoC容器,用来实现依赖注入(Dependency Injection,DI),减少耦合

Unity安装

install-package Unity

使用

            IUnityContainer container = new UnityContainer();//1、定义一个空容器
container.RegisterType<IDbInterface, DbMSSQL>();//2、注册类型,表示遇到IDbInterface的类型,创建DbMSSQL的实例
var db = container.Resolve<IDbInterface>();

注入方式

  • 构造函数注入

  • 属性注入

  • 方法注入

三种注入方式的执行顺序:构造函数注入->属性注入->方法注入

默认情况下如果构造函数上面没有使用特性,那么默认找参数最多的构造函数执行注入

生命周期

  • 瞬时生命周期

    无状态或者轻量的,使用不太频繁的临时对象

  • 单例

    整个应用,计数器,单例的服务

  • 线程单例

    一个请求

  • 其他生命周期

    • 解析生命周期

    • 分层生命周期

配置文件

  1. 安装包
install-package Unity.Interception.Configuration
  1. 配置文件

如果是单独文件的话需要设置为始终复制

<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">
<!--逗号前面是接口类型的完全限定名:命名空间+接口名称,逗号后面是DLL文件的名称 name解决同一个接口不同实例问题-->
<register type="Demo.IocUnity.IDbInterface,Demo.IocUnity" mapTo="Demo.IocUnity.DbMSSQL, Demo.IocUnity" name="sql"/>
<register type="Demo.IocUnity.IDbInterface,Demo.IocUnity" mapTo="Demo.IocUnity.DbOracle, Demo.IocUnity" name="oracle"/>
</container>
</containers>
</unity>
</configuration>
  1. 读取配置实现
            ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "Unity.config");//找配置文件的路径
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
IUnityContainer container = new UnityContainer(); section.Configure(container, "testContainer");
IDbInterface db = container.Resolve<IDbInterface>("sql");

实现原理

  • 反射

    如何找构造函数

    1. 根据特性来找[InjectionConstructor]

    2. 参数最多

  • dictionary映射

    单例和线程单例实现的区别:ThreadLocal

    ThreadLocal的主要作用是让各个线程维持自己的变量

源码

最新文章

  1. FragmentPagerAdapter+ViewPager实现Tab切换效果
  2. IOS tableview下拉刷新上拉加载分页
  3. StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks 论文笔记
  4. datatables.js 简单使用--多选框和服务器端分页
  5. JVM的ClassLoader过程分析
  6. 基于SpringMVC框架项目Demo
  7. Codeforces Round #312 (Div. 2) C. Amr and Chemistry 暴力
  8. MVC (M-V-C启动程序调用关系)
  9. bzoj1822
  10. ORA-01858: a non-numeric character was found where a numeric was expected
  11. 淘宝弹性布局方案lib-flexible研究
  12. Oracle 11g 的server结果缓存result_cache_mode
  13. VirtualBox开发环境的搭建详解
  14. Java 1.0 类与对象
  15. VMware 中安装KVM,模块不加载
  16. JVM 内存初学 堆(heap)、栈(stack)和方法区(method)
  17. Mybatis--02
  18. 性能测试-9.Controller功能介绍
  19. JavaScript中的两种全局对象
  20. 解决:CentOS下的 error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or dir

热门文章

  1. 指数分布的分布函数和概率密度函数的推导,牢记指数分布的分布函数为1-e^(-λx)
  2. 时间戳转换为yyyy-MM-dd格式
  3. 20192326杨沥凯 实验一《Linux基础与Java开发环境》实验报告
  4. thymeleaf checkbox的回显
  5. jmeterGUI&amp;非GUI模式之如何减负性能调优
  6. 题解[CF1628F]A_Random_Code_Problem
  7. jekins+svn
  8. excel快速生成相同内容
  9. mongodb下载和安装
  10. HTML&amp;CSS学习总结