此框架的目的是为 iOS/Mac 应用提供简单的依赖注入框架。
Injective 提供了通过解析属性依赖来自动连接类实例的机制。此外,Injective 确保所有必要的数据都传送给实例,使其能正确运行。
Injective 支持类似工厂的对象创建和单例对象创建。
如果您使用 git 作为项目的 Source Control Manager,请将 Injective 添加为子模块
git submodule add https://github.com/farcaller/Injective
从 https://github.com/farcaller/Injective/zipball/master 下载 Injective 源代码,并将其解压缩到项目的根目录。
将 Injective 项目添加到 Project Navigator(如果您还没有工作区,这将会创建一个新的工作区)。为此,从 Finder 拖动 Injective.xcodeproj 到项目导航器面板的最底部。
如果您还没有工作区,系统会提示您:“您想要将此项目保存到新的工作区中吗?”。保存它。
打开项目的构建设置,并将 Injective/Headers 添加到 头文件搜索路径。如果您按照步骤 0 操作,那么只需将 $(PROJECT_DIR)/Injective/Injective/Headers
添加进去即可
将以下行添加到项目的预编译头文件(pch 文件)中:#import "InjectiveContext.h"
#import "IJContext.h"
这将允许您使用 Injective 而无需在每个地方都需要 #import。
存在一个目标来构建Injective.framework,然而当前并没有稳定的版本发布。预编译的构建将在以后添加,目前建议您使用最近的git检出版本。
所有辅助工具都需要设置一个全局上下文。您可以使用以下方式指定一个:
IJContext *defaultContext = [[IJContext alloc] init];
[IJContext setDefaultContext:defaultContext];
在哪里做?尽 earliest。您可以在iOS项目中使用应用程序代理中的-application:didFinishLaunchingWithOptions:
。
要注册一个类,您需要使用IJContext类的+registerClass:instantinationMode:
方法
IJContext *myContext = [[IJContext alloc] init];
[myContext registerClass:[MyAPIController class]
instantinationMode:IJContextInstantinationModeSingleton];
然后,您可以使用以下代码获取该类的实例
MyAPIController *api = [myContext instantinateClass:[MyAPIController class]
withProperties:nil];
注意:您也可以在您的类实现中使用injective_register_singleton宏
@implementation MyAPIController
injective_register_singleton(MyAPIController)
...
@end
您可以使用IJContextInstantinationModeFactory注册一个公共类。这样,Injective将在每次实例化它时创建该类的新实例
IJContext *myContext = [[IJContext alloc] init];
[myContext
registerClass:[MyDetailViewController class]
instantinationMode:IJContextInstantinationModeFactory];
在此模式下,您可以传递将被KVC映射的额外属性
NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:
items, @"items",
nil];
MyDetailViewController *viewController = [myContext
instantinateClass:[MyDetailViewController class]
withProperties:d];
注意:您也可以在您的类实现中使用injective_register宏
@implementation MyDetailViewController
injective_register(MyDetailViewController)
...
@end
为了使Injective真正有用,您需要指定您类所需的属性集。您可以通过+injective_requredProperties
方法来完成此操作
@interface MyDetailViewController : UIViewController
@property (nonatomic, strong) MyAPIController *apiController;
@end
@implementation MyDetailViewController
injective_register(MyDetailViewController)
+ (NSSet *)injective_requredProperties
{
return [NSSet setWithObject:@"apiController"];
}
@end
还有一个方便的宏供您使用 -- injective_requires
,它执行相同的任务
@implementation MyDetailViewController
injective_register(MyDetailViewController)
injective_requires(@"apiController")
@end
您可以使用以下NSObject的分类方法在默认上下文中实例化任何对象
MyDetailViewController *viewController = [MyDetailViewController injectiveInstantiate];
Injective是一个MIT许可的框架。请在LICENSE文件中查看详细信息。
Injective框架最初由Vladimir "Farcaller" Pouzanov编写 <[email protected]>.
一些想法基于Objection框架(https://github.com/atomicobject/objection)。
我总是开放接受沟通。请通过github issues系统提交问题https://github.com/farcaller/Injective/issues/new。