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的主要作用是让各个线程维持自己的变量

源码

.NetCore【工作应用】Unity的更多相关文章

  1. 在Unity中高效工作(上)

    原地址:http://www.unity蛮牛.com/thread-19974-1-1.html 编的话:感谢做编程的IT朋友,帮我翻译文章,我又稍稍做了些修改.给点儿掌声哩.欢迎大家多多评论呦. 我 ...

  2. Unity.Interception(AOP)

            在前面我们学习到的是Unity依赖注入(DI)与统一容器来松散耦合,这个设计已经对我们系统带来了很多的好处.但是我们还会想尝试和遵循单一职责,开放封闭原则.比如我们不应该在我们的Bus ...

  3. 【Unity】第13章 光照贴图和光影效果

    分类:Unity.C#.VS2015 创建日期:2016-05-19 一.简介 在Unity 5中,Lighting是—种增强场景光照和阴影效果的技术,它可以通过较少的性能消耗使静态场景看上去更真实. ...

  4. Unity 协程与线程

    协程是不同步的 协程 不是 线程,协同程序是 不同步 的 一个线程在程序中和其他线程是异步运行的,在多处理器机器中一个线程可以同时与所有其他线程的实时运行其代码,这使得线程编程能够解决很复杂的事情,因 ...

  5. 【Unity Shader】Shader基础

    目录 Chapter3 Unity Shader 基础 Chapter3 Unity Shader 基础 概述 在Unity需要材质(Material)与Unity Shader配合使用来达到满意的效 ...

  6. Unity中关于Device Filter的选择问题

    引言 目前工作的Unity版本是5.4.1f,发布Android版本.apk的时候,对包体的大小有些疑问,就上网查了下资料,发现Build Settings——Player Settings——Oth ...

  7. Unity 将是驱动 C# 增长的引擎吗 ?

    C# 在中国的采用需要一个杀手级应用的带动, 那么这样的一个杀手级应用是 Unity吗,我这里大胆推测采用CoreCLR 的新一代完全采用C#构建的Unity 将是这样的一个杀手级应用.Unity已被 ...

  8. Unity3D专访——真正的面试

    本来想写一系列的,一半的攻击,现在面试的水.人之奸,用大哥的话说,要走新手是做螺丝钉和抹布用的.还有一半是对出出学校的或者是自废武功转3d的朋友们提供一个比較有价值的參考. 只是我时间实在仓促.没有保 ...

  9. Unity3D面试——真实的面试,unity3d面试

    本来想写一个系列的,一半是抨击现在面试之水,要人之奸,用大哥的话说,要走新手是做螺丝钉和抹布用的.另一半是对出出学校的或者是自废武功转3d的朋友们提供一个比较有价值的参考.不过我时间实在仓促.没有保证 ...

  10. Prism 文档 第三章 管理组件之间的依赖关系

                                                                          第3章:管理组件之间的依赖关系 基于Prism库的复合应用程 ...

随机推荐

  1. vue3学习

    资料: http://docs.vikingship.xyz/ 声明类型:      1.使用ref可以声明基础数据 2.使用reactive声明对象数据 3.computed可以返回一个不变的响应式 ...

  2. Ubuntu docker安装、验证、卸载

    卸载Docker CE 卸载Docker CE软件包: sudo apt-get purge docker-ce 主机上的图像,容器,卷或自定义配置文件不会自动删除.要删除所有图像,容器和卷: sud ...

  3. u8g2 资料汇集

    移植U8g2 https://www.cnblogs.com/frozencandles/p/16358483.html 函数接口说明: https://github.com/olikraus/u8g ...

  4. ubuntu 22.04 网络配置ib网卡配置

    第一步:查看Ubuntu版本与内核版本 cat /etc/issue 这说明系统的版本为:Ubuntu 20.04.4 LTS \n \l uname -a Linux gacs-gm-11 5.4. ...

  5. python 获取近几周日期

    import datetimedef get_Next_day(count): today = datetime.datetime.today().date() for i in range(coun ...

  6. 微信带参数的小程序码生成并上传到七牛云(java)

    在大家看正式内容之前请耐心的听我把这段话说完:我冒昧的猜一下,你为了解决问题估计已经看了很多文章了,如果这边文章能给你带来帮助,不胜荣幸,如果有错误也请批评指正,共同进步,我之前在完成这个功能之前,从 ...

  7. 使用NibiruSDK 坑

    最近有项目要接NibiruSDK ,在使用时需要用他们提供的软件,进行项目签名,在这里包名前必须是 com.dream.*** ,否则会导致签名失败而且没有任何提示.用DreamClass打开apk, ...

  8. vue封装全局确认弹窗

    下载文件1.弹窗组件 <template> <view class="bombFrame" v-if="bshow" :class=" ...

  9. uniapp对接ChatGPT 简单实现对话功能

    最近很火的ChatGPT来了!我也是做了一个最最基础的模型,让大家更通俗易懂! 先看效果:  接下来直接上代码: <template> <view class="conte ...

  10. [iOS] 随手记录 IDFA 的一些相关内容

    IDFA  IDFA,广告标识符,类似于这一台设备的唯一性标识符,一般提供给第三方去做一些广告的关联. 但如果用户完全 重置系统,或者 "还原位置与隐私" 这个广告标示符会重新生成 ...