UniqueDI 0.0.2

UniqueDI 0.0.2

Macsed 维护。



UniqueDI 0.0.2

  • 来自
  • MacsedProtoss

UniqueDI

Unique Dependency Injection的Objective-C版本


摘要

Objective-C版本的Unique Dependency Injection,实际上应该被认为是Dependency Inversion。凭借Objective-C的NSObject隐式基类,使用category和associated object的方式实现上下文管理和宏定义的API,使用起来更加自然和舒适。目前仍处于0.0.1版本,可能还有大改动等情况发生

进展

  • 绑定与链接
  • 上下文隔离
  • 查找上下文
  • 调试工具
  • ...

需求

iOS 10.0+

如何使用

已集成CocoaPod,通过使用pod 'UniqueDI','~> 0.0.1'即可集成

上下文

为了实现上下文的隔离,你需要显式设置其所属的上下文。

⚠️注意:虽然当Context未指定时,我们将会默认使用AppContext作为其Context,但为了防止Context不正确导致的问题,我们仍应进行显式设置。

- (instancetype)initWithContext:(UDIContext *)context; //初始化时直接传入Context

//Example
[UIViewController initWithContext:<#(UDIContext *)#>];

- (void)setAttachingContext:(UDIContext *)context; //或者手动为其指定Context

//Example
UIViewController *viewcontroller = [[UIViewController alloc]init];
[viewcontroller setAttachingContext:<#(UDIContext *)#>];

可通过以下方式来获取上下文

@property (nonatomic, strong) UDIContext* attachingContext; //直接通过getter获取该属性

//Example
UDIContext *currentContext = viewcontroller.attachingContext;


UDIAppContext //通过宏定义获取AppContext

//Example
[self setAttachingContext:UDIAppContext];

bind

将依赖注册进当前所在上下文。

注册进去的依赖是弱引用的,也就是说,注册依赖不会影响其本身的生命周期

UDIBIND(aProtocol, aProperty); //将aProperty绑定到当前所在的上下文,其类型为id<aProtocol>

//Example
UDIBIND(myProtocol,self);

同时,如果想要在attach context之后直接执行自动的bind,则建议直接使用下面的方式

- (void)didAttachContext; //会在 - (void)setAttachingContext:(UDIContext *)context 之后直接调用

//Example
@implementation MyClass
- (void)didAttachContext{
    UDIBIND(myProtocol,self);
}
//...
@end

link

从当前所在上下文注入依赖

由于Context中存储的是弱引用,所以此处可能拿到nil值,请注意这一可能。

UDILINK(aProtocol, aProperty); //从当前上下文中获取id<aProtocol>类型的依赖并将其赋值给aProperty。因此,这一宏定义展开其实为aProperty的getter,且其是懒加载的,只有调用aProperty的时候才回去获取依赖并赋值。

//Example
@interface MyClass

@property(nonatomic,strong) id<MyProtocol> my; //必须先声明这一属性

@end

@implementation MyClass

UDILINK(MyProtocol,my); //然后再进行Link

@end

如果说你只是在某一处会使用这一依赖,那么我们也可以使用inline

UDILINKINLINE(aProtocol); //从当前上下文中获取id<aProtocol>类型的依赖。其实现实际上是一个类似^id<aProtocol>{}的block。

//Example
[UDILINKINLINE(MyProtocol) myFunction];

LICENSE

本仓库遵循MIT许可证