热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Unity(六):使用场景Ⅲ:用于依赖注入(上)

我们说到哪了Unity(一):从ObjectBuilder说起Unity(二):Unity是什么?Unity(三):快

我们说到哪了...

  • Unity(一):从ObjectBuilder说起
  • Unity(二):Unity是什么?
  • Unity(三):快速入门          
  • Unity(四):使用场景Ⅰ:建立类型映射         
  • Unity(五):使用场景Ⅱ:用于单例模式         

 

有关依赖注入

什么是依赖注入,我想这个问题我在这里说就不大合适了,所以还是推荐一下大师的文章。之前的文章也提到过,“Martin Fowler的Inversion of Control Containers and the Dependency Injection pattern 是不得不推荐的,当然,如果读起来比较费劲的话,吕震宇的你真的了解Ioc与AOP吗?系列也是不错的参考”。

这里要多说一句的是,依赖注入(Dependency Injection)和控制反转(Inversion of Control)并不是同一个概念,有的人经常混在一起。有关这一点,看看前面说的Martin的文章就明白了。

 

准备工作 

为了接下来的说明,我们先编写几个后面需要的接口和类。

注:本文涉及到的IOrder接口、CommonOrder类、VipOrder类和ILogger接口、ConsoleLogger类、NullLogger类等代码请参见Unity(三):快速入门和Unity(五):使用场景Ⅱ:用于单例模式中的准备代码,这里不再重复。

IOrderWithLogging接口:

image

 

Unity支持的依赖注入方式有三种:构造器注入、设值注入、方法调用注入。

构造器注入

对于构造器注入,Unity支持两种方式的依赖注入:自动依赖注入和通过打标签标识。具体来说,对于只有单一构造函数的目标类,可以使用自动依赖注入的方式,而对于有多个构造函数的目标类,则应该使用在构造函数上打标签的方式来进行注入。

  • 单构造器自动注入

下面是我们的目标类SingleConstructor,可以看到,SingleConstructor类只有一个构造函数,构造函数中有两个参数:IOrder和ILogger。

image

下面是我们的测试代码。首先,我们建立容器,然后在容器中注册了IOrder和ILogger的具体类,同时将SingleConstructor注册为IOrderWithLogging的具体类。

在这里,我们将CommonOrder注册为单例,并为它的单实例的Discount赋值为0.8,这样做的目的是为了检验取出的IOrder的具体类为我们先前的注入到容器的CommonOrder类。

image

下面是输出结果。

image

 

  • 多构造器打标签注入

下面是我们的目标类MultipleConstructor,可以看到,MultipleConstructor类有两个构造函数,一个不带参数,一个有两个参数:IOrder和ILogger,后者打了InjectionConstructor标签。

image

下面是我们的测试代码。思路与上面的例子类似,在这里我们把IOrder和ILogger对应的具体类换成了VipOrder和NullLogger,IOrderWithLogging对应的具体类换成了MultipleConstructor。

image

下面是输出结果。

 image

这里需要注意的是,如果在上面的 MultipleConstructor类中,我们不打InjectionConstructor标签,运行结果是一样的,大家可以自己试验一下。

这是因为对于具有多个构造器的目标类,如果没有发现标有InjectionConstructor标签的构造器,Unity会自动使用参数最多的构造器。如果发现参数最多的构造器同时有多个,那么就会在运行时抛出一个异常。比如说,如果我们的MultipleConstructor类中构造函数不打InjectionConstructor标签,同时还有一个构造函数也有两个参数,结果就是这样。

转:https://www.cnblogs.com/kebixisimba/archive/2008/05/14/1196942.html



推荐阅读
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
author-avatar
琉璃梦0_471
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有