Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该何时使用Factory<;T>;而不是提供商<;T>;_Java_Dependency Injection_Dagger - Fatal编程技术网

Java 我应该何时使用Factory<;T>;而不是提供商<;T>;

Java 我应该何时使用Factory<;T>;而不是提供商<;T>;,java,dependency-injection,dagger,Java,Dependency Injection,Dagger,Dagger文档显示了如何使用提供程序获取过滤器实例,这似乎非常有意义 我正在编写一个ListAdapter,它实例化视图,我希望Dagger将其注入。我试图将提供程序注入我的列表适配器,并调用mViewProvider.get()来实例化视图 然而,Dagger文件说: 注入Provider可能会产生令人困惑的代码,并且可能是图形中范围错误或结构错误的对象的设计气味。通常,您会希望使用工厂或惰性或重新组织代码的生命周期和结构,以便只注入T 我可以看到我如何使用工厂,以类似于使用辅助注射时所需的

Dagger文档显示了如何使用
提供程序
获取
过滤器
实例,这似乎非常有意义

我正在编写一个
ListAdapter
,它实例化视图,我希望Dagger将其注入。我试图将
提供程序
注入我的
列表适配器
,并调用
mViewProvider.get()
来实例化视图

然而,Dagger文件说:

注入
Provider
可能会产生令人困惑的代码,并且可能是图形中范围错误或结构错误的对象的设计气味。通常,您会希望使用
工厂
惰性
或重新组织代码的生命周期和结构,以便只注入
T

我可以看到我如何使用工厂,以类似于使用辅助注射时所需的方式

但是,如果我必须自己编写前者,那么使用我自己的
工厂
比使用Dagger的
提供程序
有什么好处呢?

提供程序
在系统中具有非常具体的意义。它是图形管理对象的委托构造函数<代码>提供程序具有特定的保证/行为,我通常建议不要注入
提供程序
,除非您支持某些需要它的遗留情况

Factory
就是一个例子-FooFactory更准确,因为它的目的不是使用手工轧制的工厂,而是使用类似于
AutoFactory
()的东西来生成创建对象的工厂。这样,您就不必编写自己的文档,但在编写这些文档时,
AutoFactory
尚未构建

最终原因主要是代码清晰和长期维护。使用dagger的实例管理作为事实上的实例工厂是可能的,但有局限性,因为它只能处理注入依赖项的实例。如果不添加其他作用域或图形层,则无法支持调用堆栈依赖关系。在Guice中,这一事实常常导致人们使用额外的作用域来将堆栈依赖项转换为对象实例(provision)依赖项,方法是使用自定义作用域玩游戏,并将其对象图复杂化和分层,以获得一些免费代码

正是为了解决这个问题,(在guice中)创建了辅助注入(Assisted Injection)和(在Dagger中)自动工厂(AutoFactory)——这样您就可以做语义上更清晰的事情,而不依赖于框架内部,而是为您自动完成它


不使用
提供者是一种意见。如果你愿意,你可以这样做,但这不是推荐的做法。相反,我们建议使用类似于
AutoFactory
的解决方案,以获得更好的命名类型,在您的系统中具有更清晰的含义,从而支持更灵活地处理调用堆栈状态。

AFAIK Factory意味着您每次都会获得一个新对象。提供者暗示池是一种选择(通常更好),尽管在需要新对象时通常需要工厂。Lazy是一个针对一个对象的按需工厂。Dagger2中的工厂仍然适用吗?很好,但AutoFactory似乎还没有进入Maven Central(价值和服务)的垃圾中-我忘了我们推迟了发布,因为我们没有像我们希望的那样充实测试。我会继续努力。再次努力让autofactory尽快发布?我已经向maven发布了autofactory 0.1-beta1,现在已经在中央回购协议中。你必须询问该团队,但一般来说,这是谷歌非常常见的模式,作为API可能改变的信号。我也知道重写AutoFactory有很大的希望,但他们从来没有优先考虑过。google.com/github/truth在经历了数百万年的beta测试后,几周前才发布了1.0。请随时提交要求1.0 AutoFactory的问题。:)(我不再在谷歌工作,对此无能为力,只能加入你的抱怨)