我正在尝试决定是否使用Transfuse或Dagger进行
Android依赖注入.我从未使用过Transfuse,并且对Dagger有基本的了解.非常感谢.
解决方法
首先,我是
Transfuse的主要作者,因此这个答案在这方面可能有点倾斜.
@H_301_6@Transfuse和Dagger都以类似的方式处理Android的依赖注入/控制反转.两者都在编译时通过JSR269使用注释处理来生成支持DI / IOC功能的代码.这允许他们避免通常与非Android Java中的DI容器相关联的昂贵的基于运行时反射的分析.在没有详细说明的情况下,Dagger和Transfuse确实以不同的方式处理代码生成,这反映在库的功能上.此外,Transfuse和Dagger都使用常见的JSR330注释(@Inject,Provider等).这意味着他们都遵循Guice式注射方案.
@H_301_6@以下是在Dagger中创建对象图的方法:
> Transfuse满足JSR330,Dagger特别没有. Dagger开发人员希望在简单性方面犯错误,避免方法注入使他们避免了一些令人困惑的案例(link).
>对于没有生成代码的情况,Dagger有一个基于反射的引擎. Transfuse不会并且需要生成代码(运行注释处理器)才能工作.
> Transfuse将注入私有字段,构造函数,方法(由于反射开销,不一定推荐).在这种情况下,Dagger抛出异常.
> Dagger以非常直接的方式使用模块,反映了Guice的功能.每次创建对象图时,都可以选择使用Module类配置它,即:ObjectGraph.create(new DripCoffeeModule()). Transfuse的配置模块有点不同,因为它在编译时被合并到应用程序中. Transfuse中的每个模块都是项目的全球模块(这可能会在Transfuse的未来版本中发生变化,但对于Transfuse的使用尚未成为问题).
> Dagger中的单身人士是每个对象图,其中Transfuse中的Singletons是应用程序的全局. @H_301_6@Dagger和Transfuse之间的最大区别在于Dagger专注于成为一个简单的依赖注入库,而Transfuse则专注于“make Android a better API using performance sensitive techniques” @H_301_6@Transfuse支持这些功能以及DI: @H_301_6@> POJO组件
>清单管理
> Roboguice / Butterknife式注射
>轻量级事件系统(@Observes,@ OnCreate等)
> AOP @H_301_6@如果您有兴趣,我建议您尝试使用Transfuse.就个人而言,我很想知道你与Dagger对比的经历.我们有一个mailing list,你可以在网站上与社区分享,并通过documentation.
public class DaggerActivity extends Activity { @Inject Example example; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ObjectGraph.create().inject(this); //do something else... } }@H_301_6@Transfuse中的等效代码使用其@Factory功能:
@Factory public interface Injector { Example get(); } public class TransfuseActivity extends Activity { Example example; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); example = Factories.get(Injector.class).get(); //do something else... } }@H_301_6@Transfuse旨在以下列方式使用,但是,利用POJO组件,生命周期事件等:
@Activity public class TransfuseActivity{ @Inject Example example; @OnCreate public void doSomethingElse(){ //do something else... } }@H_301_6@这是Transfuse和Dagger中DI引擎的一些细微差别: @H_301_6@> Transfuse支持(以及它可以)循环依赖,Dagger故意在这种情况下抛出异常.
> Transfuse满足JSR330,Dagger特别没有. Dagger开发人员希望在简单性方面犯错误,避免方法注入使他们避免了一些令人困惑的案例(link).
>对于没有生成代码的情况,Dagger有一个基于反射的引擎. Transfuse不会并且需要生成代码(运行注释处理器)才能工作.
> Transfuse将注入私有字段,构造函数,方法(由于反射开销,不一定推荐).在这种情况下,Dagger抛出异常.
> Dagger以非常直接的方式使用模块,反映了Guice的功能.每次创建对象图时,都可以选择使用Module类配置它,即:ObjectGraph.create(new DripCoffeeModule()). Transfuse的配置模块有点不同,因为它在编译时被合并到应用程序中. Transfuse中的每个模块都是项目的全球模块(这可能会在Transfuse的未来版本中发生变化,但对于Transfuse的使用尚未成为问题).
> Dagger中的单身人士是每个对象图,其中Transfuse中的Singletons是应用程序的全局. @H_301_6@Dagger和Transfuse之间的最大区别在于Dagger专注于成为一个简单的依赖注入库,而Transfuse则专注于“make Android a better API using performance sensitive techniques” @H_301_6@Transfuse支持这些功能以及DI: @H_301_6@> POJO组件
>清单管理
> Roboguice / Butterknife式注射
>轻量级事件系统(@Observes,@ OnCreate等)
> AOP @H_301_6@如果您有兴趣,我建议您尝试使用Transfuse.就个人而言,我很想知道你与Dagger对比的经历.我们有一个mailing list,你可以在网站上与社区分享,并通过documentation.