Dependency injection 为什么会有';Google Dagger 2中没有bind()to()函数吗?

Dependency injection 为什么会有';Google Dagger 2中没有bind()to()函数吗?,dependency-injection,guice,dagger-2,Dependency Injection,Guice,Dagger 2,我发现bind().to()在GoogleGuice中非常方便和清晰。我认为匕首2中@Provides和provider函数的组合要重一些。为什么匕首2不支持这样的糖 Dagger是一个编译时注释处理器:它在生成接口实现时实际上并不运行代码,而且(通过)甚至无法访问处于可导航(抽象语法树)或可运行状态的方法实现。它只能看到类元素(方法和字段)及其注释,这是必然的,因此Dagger可以生成类似DaggeryYourComponent的实现 相反,Guice完全是一个运行时/反射框架,每次创建注入器

我发现bind().to()在GoogleGuice中非常方便和清晰。我认为匕首2中@Provides和provider函数的组合要重一些。为什么匕首2不支持这样的糖

Dagger是一个编译时注释处理器:它在生成接口实现时实际上并不运行代码,而且(通过)甚至无法访问处于可导航(抽象语法树)或可运行状态的方法实现。它只能看到类元素(方法和字段)及其注释,这是必然的,因此Dagger可以生成类似
DaggeryYourComponent
的实现

相反,Guice完全是一个运行时/反射框架,每次创建注入器时都运行
bind
语句(包括任何条件、循环、模块子类)。新实例以反射方式创建,Guice将在运行时扫描每个类以确定其依赖关系。这在如何调用
bind
方面为您提供了更大的灵活性,但在内存和处理受限的环境中,尤其是在Android where这样的环境中,性能要慢得多

简而言之,转换到编译时代码生成限制了您表达绑定的方式和位置,但作为交换,您可以完全避免反射并获得显著的性能改进。

Dagger是一个编译时注释处理器:它在生成接口实现时不会实际运行代码,并且(通过)甚至无法访问处于可导航(抽象语法树)或可运行状态的方法实现。它只能看到类元素(方法和字段)及其注释,这是必然的,因此Dagger可以生成类似
DaggeryYourComponent
的实现

相反,Guice完全是一个运行时/反射框架,每次创建注入器时都运行
bind
语句(包括任何条件、循环、模块子类)。新实例以反射方式创建,Guice将在运行时扫描每个类以确定其依赖关系。这在如何调用
bind
方面为您提供了更大的灵活性,但在内存和处理受限的环境中,尤其是在Android where这样的环境中,性能要慢得多


简言之,转换为编译时代码生成限制了您表达绑定的方式和位置,但作为交换,您可以完全避免反射并获得显著的性能改进。

从技术上讲,模块允许这样做

@Module
public class MyModule {
    @Provides
    MyInterface myInterface(MyClass myClass) { // <-- equivalent of `bind().to()`
        return myClass;
    }
}
@模块
公共类MyModule{
@提供

MyInterface MyInterface(MyClass MyClass){/从技术上讲,模块允许这样做

@Module
public class MyModule {
    @Provides
    MyInterface myInterface(MyClass myClass) { // <-- equivalent of `bind().to()`
        return myClass;
    }
}
@模块
公共类MyModule{
@提供

MyInterface MyInterface(MyClass MyClass){//Hi@Jeff非常感谢你的解释!我只是有一个问题:Dagger 2在编译时代码生成技巧时是否可能使用bind().to()语法?我只是认为@Provides和manually new一些实现实例比bind().to()要重一点。只有编译包含模块的代码,运行这些模块以便为Dagger生成的代码生成绑定,然后编译这些代码以形成应用程序,这才有效。问题是,在Dagger完成之前,您的代码通常无法完全编译:DaggerYourComponent没有定义,所以编译将失败。考虑到需要非常具体的项目设置,我认为您的建议不太可能获得支持。备选方案:为您编写一个实现Guice风格可运行模块和代码gens Dagger模块的工具。:)嗨@Jeff非常感谢您的解释!我只是有一个问题:Dagger 2是否有可能绑定()语法糖,而它做编译时代码生成技巧?我只是认为@Provides和manually new一些实现实例比bind()要重一点。只有编译包含模块的代码,运行这些模块以便为Dagger生成的代码生成绑定,然后编译这些代码以形成应用程序,这才有效。问题是,在Dagger完成之前,您的代码通常无法完全编译:DaggerYourComponent没有定义,所以编译将失败。鉴于需要非常具体的项目设置,我认为您的建议不太可能获得支持。备选方案:为您编写一个实现Guice风格可运行模块和code gens Dagger模块的工具。:)我不太确定这是如何回答问题的,正如问题提到的
@提供
@JeffBowman
@Binds
似乎是“Google Dagger 2中为什么没有bind().to()函数”的直接答案@Tavian是吗?它似乎回答了“我应该使用什么”或“支持的Dagger语法有多接近”,而不是Guice方法调用不受支持或不可能的原因。我不太确定这是如何回答这个问题的,因为问题中提到的
@Provides
@JeffBowman
@Binds
似乎是“Google Dagger 2中为什么没有bind().to()函数”的直接答案。不过,Tavian是吗?它似乎回答了这个问题“我应该改为使用什么”或“支持的Dagger语法有多接近”,而不是为什么Guice方法调用不受支持或不可能。