iOS依赖注入框架系列(二):设置Typhoon

在循环的最后一部分,我们遇到了依赖注入框架为iOS - 台风,并审查其项目Rambler.Pochta使用的基本示例。 这一次,我们进入它的内部结构的研究。

周期“在iOS中右依赖驱动的应用程序”

介绍

要开始分析一个小字典将被广泛使用在这篇文章中的术语:

  • 大会(读作[essembli])。 最近相当于俄罗斯
    - 装配设计。 台风 - 一个对象,它包含了所有的应用程序依赖的配置,基本上是整个体系结构的骨干。 到外面的世界,当被激活时,像普通的工厂。
  • 定义。 至于俄语翻译- 我印象最深刻的结构中,由于最接近原始版本TyphoonDefinition -是是一种依赖模型包含的信息,如被创建的类的对象,其属性,生命周期的类型的对象。 大部分从以前的文章中的例子处理一样的各种自定义选项TyphoonDefinition。
  • 范围。 这很简单 - 这是使用台风创建的对象的生命周期的类型。
  • 激活。 通过该过程中的所有对象继承人TyphoonAssemby
    TyphoonDefinition而是开始给类的实例实。 激活的原理和精髓考虑如下。

并再次我要强调的事实,这是理解框架的基本原则很重要 - 然后我们就可以放心地继续前进,并探讨所有其他馍台风,并非住在他们实施的细节。

为了不成为一个巨大的混乱代码清单,我偶尔也会提及该框架的具体文件,并只给予最有趣的时刻。 我提醒你注意一个事实,即台风框架的当前版本为写这篇文章- 3.1.7。

初始化

使用台风的应用程序的生存周期如下:

  • 呼叫main.m文件
  • 创建的UIApplication - [UIApplication的初始化]
  • 创建UIAppDelegate - [UIAppDelegate的init]
  • 呼叫setDelegate:在实例创建的UIApplication
  • 呼叫zasvizzlennoy 教室TyphoonStartup实施setDelegate:
  • 调用-applicationDidFinishLaunching:withOptions:在实例UIAppDelegate

这是zasvizzlennom setDelegate:是创建和激活开始装配。

自动装料设备可能有两种方式:要么我们已经指出在他们班下的Info.plist键TyphoonInitialAssemblies:

+(ID)factoryFromPlistInBundle:(*一个NSBundle)软件包

或实现在我们-initialFactory AppDelegate中的方法:

+(TyphoonComponentFactory
*)factoryFromAppDelegate:(ID)的appDelegate

如果不这样做,无论是1还是其他 - 组件将不得不在其他地方创造他的臂膀是不推荐的代码。

有关台风的初始化更多细节可以在下面的源文件中找到:

  • TyphoonStartup.m
  • TyphoonComponentFactory.m

激活

这个过程是在框架的关键。 通过激活是指创建类TyphoonBlockComponentFactory,实例是所有活化组件的“发动机罩下”的目的。 因此,任何组件充当与该工厂的通信的接口。

让我们看看会发生什么,是不是特别进入细节:

  1. 在TyphoonBlockComponentFactory称为初始化-initWithAssemblies :,而被传递给输入阵列组件,其必须被激活。
  2. 每个生成的活化的组件definition‘ov的,指定一个唯一的密钥(该方法的+ Randomnaya字符串名称)。
  3. 所有TyphoonDefinition加入到新创建的注册表TyphoonBlockComponentFactory阵列。

当然,这三个点不限于:为每个注册TyphoonDefinition加入 方面 ,所有依赖svizzlyatsya吸气剂,从而创造一个链初始化TyphoonBlockComponentFactory池中的对象图是实例 -在一般情况下,以确保该框架的操作产生了大量不同的动作。 在这篇文章中,我们将不会进入我们每个程序的细节,因为这会使人忽视的台风一般原理的理解。

我们已经看到了如何激活TyphoonAssembly -有明白为什么这一切的事。 每当我们根据TyphoonDefinition手动拉组件的任何方法轮番出现以下情况:

- (无效)forwardInvocation:(NSInvocation的*)anInvocation

所得_factory NSInvocation的处理并转换成一个呼叫到以下方法:

- (ID)componentForKey:(*的NSString)键的args:(TyphoonRuntimeArguments
*)的args

据来自selector‘a关键方法生成得到一名注册TyphoonBlockComponentFactory definition‘ov,然后在此基础上,或者创建一个新的实例或重复使用的缓存。

更多关于激活过程可以在下列的源文件中找到:

  • TyphoonAssembly.m
  • TyphoonBlockComponentFactory.m
  • TyphoonTypeDescriptor.m
  • TyphoonAssemblyDefinitionBuilder.m
  • TyphoonStackElement.m

用故事板的工作

引擎盖下台风使用一个子类UIStoryboard - TyphoonStoryboard。 以抓人眼球的第一个特征
- 是一个工厂方法是从其父的额外的参数不同 - 工厂:

 + (TyphoonStoryboard *)storyboardWithName:(NSString *)name factory:(id<TyphoonComponentFactory>)factory bundle:(NSBundle *)bundleOrNil;

正是在这家工厂实现协议TyphoonComponentFactory,将搜索屏幕definition‘ov当前故事板。 看看依赖注入ViewController‘y的各个阶段:

  1. 首先,我们发现自己在-instantiateViewControllerWithIdentifier :,则重新定义TyphoonStoryboard的方法。
  2. 它通过调用super‘a创建所需的控制器的一个实例。
  3. 发起的注入电流控制器的所有相关性及其子公司控制器: 

    - (无效)injectPropertiesForViewController:(*的UIViewController)的viewController

  4. 在TyphoonBlockComponentFactory来熟悉的过程 - 检查当前类TyphoonDefinition和启动注射的工序在她的依赖关系图。

现在,我不会与TyphoonStoryboard附件中的特定实现居住 -的话题将受到下列文章之一。

与故事板的工作实现的更多细节,可以在以下源文件中找到:

  • TyphoonStoryboard.m
  • TyphoonBlockComponentFactory.m

TyphoonDefinition

几乎每一个片断由我以某种形式或给予其他类满足TyphoonDefinition。 正如我所提到何时上市的条件,TyphoonDefinition -一种配置类的创建依赖-在利益放在首位所以对我们来说是它的界面:

  • 类_type -根据类创建
  • * NSString的_key -这是激活台风时产生的唯一密钥,
  • TyphoonMethod * _initializer -在创建的对象初始化注射 ,包含其参数所需的初始化和收集签名,
  • TyphoonMethod * _beforeInjections -一个方法,将依赖注入之前被调用,
  • TyphoonMethod * _afterInjections -一个将注入依赖后调用的方法,
  • *的NSMutableSet _injectedProperties -通过建立相关的集合注射物业 ,
  • NSMutableOrderedSet * _injectedMethods -收集方法,其中传输依赖于某些( 注射法 )
  • 要创建类型的生命周期的对象, - TyphoonScope范围
  • TyphoonDefinition * _parent - 基本TyphoonDefinition,所有将被当前被继承的属性,
  • BOOL抽象 -一个标志,指示只能用于继承的执行现有的配置,并提出它的对象不应该直接创建。

的个体值得注意范围对象的所有上述性能。

更多有关TyphoonDefinition的原理可在下列的源文件中找到:

  • TyphoonDefinition.m
  • TyphoonAssemblyDefinitionBuilder.m
  • TyphoonFactoryDefinition.m
  • TyphoonInjectionByReference.m
  • TyphoonMethod.m

TyphoonScope

如果此工厂将从内存被释放,她清除所有对象图- 重要的是要清楚地认识到,在谈论不同类型的对象的生命周期,我们仍然牢牢绑在实例中使用TyphoonBlockComponentFactory的寿命是很重要的。

让我们来看看每个结果TyphoonScope值的:

  • TyphoonScopeObjectGraph

    在同一范围内构建依赖图形对象的过程中会产生一次。 从技术上讲,它看起来是这样的:你创建一个实例(任何定义)之前,建立一个池为对象图在构建依赖图的过程范围内的对象,所有的对象 - 图范围的进入游泳池,但在创建实例后,池清除。

  • TyphoonScopePrototype 

    每次用范围的TyphoonDefinition将创建类的新实例。

  • TyphoonScopeSingleton 

    与生命周期对象将生活在整个生命TyphoonComponentFactory。

  • TyphoonScopeLazySingleton 

    顾名思义 - 是将在它的第一个电话的时间来创建一个单例。

  • TyphoonScopeWeakSingleton 

    单产生使用这样TyphoonDefinition,完全相同,只要它是由至少一个对象引用的存储在存储器中 -否则它会被释放。

创建的对象,这取决于其配置的范围的特性,被存储在池TyphoonComponentFactory之一,以一定的方式的各动作。

更多关于缓存依赖台风可在下列资料中找到的原则:

  • TyphoonComponentFactory.m
  • TyphoonWeakComponentPool.m
  • TyphoonCallStack.m

闭幕

我们不得不考虑台风框架只是最基本的原则 -供应,激活工厂 устройство TyphoonAssembly , TyphoonStoryboard , TyphoonDefinition иTyphoonBlockComponentFactory , 特别对象的生命周期中创建。 该库包含了很多有趣的概念,它有时干脆迷人的实施。

我强烈建议休息几天在他们的头上研究埋葬- 它比值得替代了许多经验教训“工作在Xcode鼠标斯威夫特免费的,没有短信”风格的研究,“高级动画指示下载文件。”

在接下来的文章中,您将学习如何避免巨大的工厂的组装模块的外观,合适的错层结构并覆盖了整个事情的测试。

周期“在iOS中右依赖驱动的应用程序”

相关链接

时间: 2024-10-07 07:48:41

iOS依赖注入框架系列(二):设置Typhoon的相关文章

iOS依赖注入框架系列(三):模块化Typhoon

在以前的文章 系列中,我们简要地讨论了组织和运作框架台风的基本原则 -为iOS依赖注入容器. 但是,如何将工具布置一点理解-最重要的是要正确地使用它. 在第一部分中,我们看的创建依赖关系,现在处理更高级别的配置设置的各种例子-模块分为TyphoonAssembly自己和测试. 周期"在iOS中右依赖驱动的应用程序" 熟悉台风 该器件台风 模块化台风 台风技巧与诀窍 台风替代品 (可选)Rambler.iOS#3. 依赖注入的iOS. 幻灯片 (可选)Rambler.iOS#3. 依赖注

iOS依赖注入框架系列(一):介绍Typhoon

介绍 作为这一系列的一部分,我不会去考虑依赖性倒置原则,或模式依赖注入的理论 -理所当然地认为读者已经做好充分准备,以确保了解禅宗,并直接进入实践(链接探索中给出的理论帖子的结尾). 台风框架 -是最有名的和流行的执行DI容器Objective-C的应用和斯威夫特. 该项目是相当年轻的-第一次提交被做在2012年底,但它已得到了很多球迷 . 特别值得一提它的创始人的积极支持该项目(其中一个,顺便说一句,生活和在鄂木斯克作品) -满足最成熟的问题十分钟,几个小时来讨论整个团队加入. 为什么我们需要

ASP.NET Core技术研究-探秘依赖注入框架

原文:ASP.NET Core技术研究-探秘依赖注入框架 ASP.NET Core在底层内置了一个依赖注入框架,通过依赖注入的方式注册服务.提供服务.依赖注入不仅服务于ASP.NET Core自身,同时也是应用程序的服务提供者. 毫不夸张的说,ASP.NET Core通过依赖注入实现了各种服务对象的注册和创建,同时也实现了面向抽象的编程模式和编程体验,提升了应用程序的扩展性. 今天,我们普及一下ASP.NET Core中依赖注入的一些基本知识. 一.服务的注册 我们通过创建一个ASP.NET C

Maven入门系列(二)--设置中央仓库的方法

原文地址:http://www.codeweblog.com/maven入门系列-二-设置中央仓库的方法/ Maven仓库放在我的文档里好吗?当然不好,重装一次电脑,意味着一切jar都要重新下载和发布. 下载的地址是中央仓库mvnrepository.com,当然,全球很多个仓库. 资源的坐标简称GVA 那么,现在如何修改maven的本地仓库路径呢? 关键在于maven文件夹的config下的settings.xml(E:\IDE\apache-maven-3.3.1\conf\settings

快如闪电、超轻量级的基于.Net平台的依赖注入框架Ninject

一.为什么要使用依赖注入框架 依赖注入框架也叫IoC容器.它的作用使类与类之间解耦 我们看看为什么要用依赖注入框架,举个几个梨子: 1,高度耦合的类 有一个Order类,Order类是用于订单操作的,DataAccess使用的sqlserver的方式查询订单.看看代码: public class Order { private DataAccess dataAccess = new DataAccess(); public string QueryOrder() { return dataAcc

Dagger——Android上的依赖注入框架

* 你也可以去Github查看这片文章 简介 在开发程序的时候,会用到各种对象,很多对象在使用之前都需要进行初始化.例如你要操作一个SharedPreference,你需要调用getSharedPreferences(String name,int mode)来获取一个对象,然后才能使用它.而如果这个对象会在多个Activity中被使用,你就需要在每个使用的场景中都写下同样的代码.这不仅麻烦,而且增加了出错的可能.dagger的用途就是:让你不需要初始化对象.换句话说,任何对象声明完了就能直接用

Android Dagger依赖注入框架浅析

今天接触了Dagger这套android的依赖注入框架(DI框架),感觉跟Spring 的IOC差不多吧.这个框架它的好处是它没有采用反射技术(Spring是用反射的),而是用预编译技术,因为基于反射的DI非常地耗用资源(空间,时间) 由于现在开发都是用Android Studio了,所以我这里大概讲下配置Dagger框架的开发环境,需要怎么做. (由于Android Studio中用Gradle,所以跟传统我们用Eclipse配置的话,直接导入jar包,有点不一样.) 在开始看我的博文前,希望

Spring.NET依赖注入框架学习--概述

Spring.NET依赖注入框架学习--Spring.NET简介 概述 Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序.它提供了很多方面的功能,比如依赖注入.面向方面编程(AOP).数据访问抽象及ASP.NET扩展等等.Spring.NET以Java版的Spring框架为基础,将Spring.Java的核心概念与思想移植到了.NET平台上. 企业级应用一般由多个物理层组成,每个物理层也经常划分为若干功能层.不同层次之间需要相互协作,例如,业务服务层一般需

Spring.NET依赖注入框架学习--简单对象注入

Spring.NET依赖注入框架学习--简单对象注入 在前面的俩篇中讲解了依赖注入的概念以及Spring.NET框架的核心模块介绍,今天就要看看怎么来使用Spring.NET实现一个简单的对象注入 常用文件 我们使用Spring.Net 框架经常要使用到的是以下文件: Common.Logging.dll  包含了Spring.Net日志方面的功能(必须) Spring.Core.dll       包含了Spring.Net 的核心库(必须) Spring.Data.dll       包含了