java轻量级注入框架_Zenject——轻量级依赖注入框架 for Unity

理论

在一般情况下,如果一个类依赖于某些服务,那么可能会在内部去创建需要的服务:

public@H_502_8@ class@H_502_8@ Foo

{

ISomeService _service;

public@H_502_8@ Foo@H_502_8@()

{

_service = new@H_502_8@ SomeService();

}

public@H_502_8@ void@H_502_8@ DoSomething@H_502_8@()

{

_service.PerformTask();

...

}

}

在项目规模比较小的时候这种做法无可厚非,但随着项目规模的扩大,Foo类与SomeService的紧耦合会显得缺少灵活性。

Foo应该只需要关心自身的实现并且确认服务提供了自身所需的接口即可,而不需要关心所选择的服务的实现细节:

public@H_502_8@ class@H_502_8@ Foo

{

ISomeService _service;

public@H_502_8@ Foo@H_502_8@(ISomeService service)

{

_service = service;

}

public@H_502_8@ void@H_502_8@ DoSomething@H_502_8@()

{

_service.PerformTask();

...

}

}

在这种定义方式下,假设bar类使用了Foo类,那它也不用关心Foo如何使用SomeService的具体实现:

public@H_502_8@ class@H_502_8@ Bar

{

ISomeService _service;

public@H_502_8@ Bar@H_502_8@(ISomeService service)

{

_service = service;

}

public@H_502_8@ void@H_502_8@ DoSomething@H_502_8@()

{

var@H_502_8@ foo = new@H_502_8@ Foo(_service);

foo.DoSomething();

...

}

}

使用依赖注入的方式,所需要的服务都需要等待外部来注入,在这张根据依赖关系而组成的“对象图”中,实现注入逻辑的部分就是它的”根部”(也就是前面文章说到的注入器),它看起来就类似:

var@H_502_8@ service = new@H_502_8@ SomeService();

var@H_502_8@ foo = new@H_502_8@ Foo(service);

var@H_502_8@ bar = new@H_502_8@ Bar(foo);

.. etc.

作为依赖注入框架,Zenject会帮助完成这一部分工作,因此程序员不需要再编写如以上的代码;

其他问题

使用DI要明白和理解使用它的优点是什么,其一就是由于约定了每个类都不去干涉所依赖服务的具体实现,带来的好处就是对于服务类接口的修改是很方便的(如上面的例子中要修改ISomeServer的内部实现逻辑,只要确保PerformTask的服务,那么Foo根本不需要任何的改动)。

另一个问题是运用DI时,会从每个类中抽出接口,并使用这些接口,而不是直接使用类,原本如此的定义的目的是为了使代码具有更松的耦合,然而大多数情况下,某个功能只有单一的,特点的类去实现,这种情况下使用接口只会增加不必要的开销,而且类自身已经提供了共有成员作为接口。

一个好的经验法则是:只有当一个类拥有一个以上的不同实现时,才为其创建接口(重用、抽象原则)。

具体的使用说明可以看官方Githttps://github.com/modesttree/Zenject#hello-world-example

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值