- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我们使用了 RoboGuice,但它已被弃用,我开始用 Dagger2 替换它。
// https://github.com/google/dagger
compile('com.google.dagger:dagger:2.7')
annotationProcessor 'com.google.dagger:dagger-compiler:2.7'
provided 'org.glassfish:javax.annotation:10.0-b28'
@Module
public class ApplicationModule {
Application mApp;
public ApplicationModule(@NonNull Application app) {
Preconditions.checkNotNull(app);
mApp = app;
}
@Provides
@Singleton
public SharedPreferences providesSharedPrefs() {
return PreferenceManager.getDefaultSharedPreferences(mApp);
}
@Provides
@Singleton
public DateHelper providesDateHelper() {
return new DateHelper(mApp);
}
@Provides
@Singleton
public PersistentConfig providesPersistentConfig() {
return new PersistentConfig(mApp);
}
@Provides
@Singleton
public OttoBus providesOttoBus() {
return new OttoBus();
}
}
public class Application extends MultiDexApplication {
private ApplicationComponent mApplicationComponent;
@Override
public void onCreate() {
super.onCreate();
mApplicationComponent = DaggerApplicationComponent.builder()
.applicationModule(new ApplicationModule(this))
.build();
mApplicationComponent.inject(this);
}
public static Application getApp(@NonNull Context context) {
return (Application) context.getApplicationContext();
}
public static ApplicationComponent getApplicationComponent(@NonNull Context context) {
return getApp(context).getApplicationComponent();
}
}
在我想注入(inject) ApplicationComponent 的所有地方之后
例如MainActivity
public class MainActivity extends AppCompatActivity {
@Inject
PersistentConfig mPersistentConfig;
@Inject
OttoBus mOttoBus;
@Override
public void onCreate(Bundle savedInstanceState) {
Helper.manageRotation(this);
super.onCreate(null);
setContentView(R.layout.main_layout);
Application.getApplicationComponent(this).inject(this);
}
}
Application.getApplicationComponent(context).inject(this);
第一个问题:我对interface ApplicationComponent
感到很困惑。它必须在我想使用注入(inject)的地方提供所有 Activity/fragment/服务(等)。但我不能使用像 Activity / Fragment
这样的通用对象.还是我真的脱离了现实,不了解 Dagger2 的工作原理?
因为这对于具有大约 50 多个 Activity 和大量 fragment/服务的项目来说真的很疯狂......
@Singleton
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
void inject(@NonNull Application app);
void inject(@NonNull MainActivity object);
void inject(@NonNull DispatcherActivity object);
void inject(@NonNull DateTimeHelper object);
void inject(@NonNull DatabaseHelper object);
void inject(@NonNull LandingPageActivityFragment object);
void inject(@NonNull RedirectActivity object);
void inject(@NonNull CategoryFragment object);
void inject(@NonNull BaseModuleFragment object);
void inject(@NonNull NotificationHelper object);
void inject(@NonNull RecordAdapter object);
void inject(@NonNull PagingProvider object);
void inject(@NonNull FilterDialog object);
... next 100+ injections?
}
我说,这不可能是真的......
第二个问题:当我不能像void inject(@NonNull NotificationHelper<? extends GenericObject> object);
那样使用它时,我如何提供注入(inject)泛型类?因为它需要特定的对象。所以我必须把所有这些对象写在ApplicationComponent
里面并且不使用 ?
符号?
这不仅仅是疯狂 :(。也许最好继续使用 RoboGuice,它对开发人员更加友好,并且不需要产生这种开销并手动检查每个注入(inject)的对象?当我忘记将它们添加到此列表时,我会在运行时获取 NPE
(当我不对其进行大量测试时,它会使客户崩溃)。
当不可能使用像Activity / Fragment / Service
这样的通用对象时,手动编写它比列出所有对象要快得多。 .
有没有更好的解决方案,当我不想使用相同的通用 BaseActivity
这将注入(inject) ApplicationModule
的每一部分每个 Activity 都将由这个巨大的 BaseActivity
扩展?
最佳答案
这个问题有投诉的方面,但要尝试回答:
I'm really confused about interface ApplicationComponent which must provide all activities/fragments/services (etc) where I want to use injection. But I can't use generic objects like Activity / Fragment. Or am I really out of reality and don't understand how Dagger2 works?
确实,这就是 Dagger 2 的工作原理;它必须在注入(inject)器(组件)内静态提供注入(inject)目标的类型,并且不能使用“通用”(协变)类型。 Dagger 2 这样做是为了维护一个 100% 静态的 DI 框架。
请注意,您指定的是 RecordAdapter
和 DatabaseHelper
作为注入(inject)部位。您可能不需要这样做,您应该尝试仅指定构造函数不可见的顶级对象( Activity
、 Fragment
和 Service
)作为注入(inject)站点。其余对象应该能够通过使用 @Inject
注释它们的依赖关系来构建。并在 Module
中指定它们的依赖关系(如果有的话) .
Maybe better stay with RoboGuice which is much more developer friendly and don't need make this overhead and manual check every injected objects
是的,Roboguice 更友好,因为您不必担心指定注入(inject)目标。但是,请考虑 Roboguice 中的以下内容: 1. 错误设置对象图时出现的“死亡的红色堆栈跟踪”2. 事实上,您无法通过 Find Usages 查看您的项目中实际使用了哪些接口(interface)实现,这也可能是“开发人员不友好”
Is there a better solution, when I don't want use same generic BaseActivity which will inject every part of ApplicationModule and every activity will be extended by this huge BaseActivity?
好吧,这取决于您使用的依赖项以及使用的位置。如果你有一小部分依赖项要到处注入(inject),那可能是最好的解决方案,即制作一个BaseActivity
。接收这些注入(inject)并使它可用于您的所有子类。或者,您可以使用子组件和模块来划分您的对象图,以便您可以将消费者/注入(inject)目标与正确的模块组合在一起。这样一来,您就不需要一个列出所有注入(inject)部位的“上帝”组件。
Second question: How I can provide to inject generic classes, when I can't use it like void inject(@NonNull NotificationHelper object); because it require specific object. So I must write all this objects inside ApplicationComponent and not use ? notation?
是的,您必须提供注入(inject)目标的不变类型。我不确定你的 NotificationHelper<String>
是顶级类型。当你注入(inject) Fragment
时,为什么不通过对象图注入(inject)它呢? , Activity
或 Service
?
如果它绝对必须是一个注入(inject)目标,您将需要子类化:NotificationHelper<String>
和 Notification<Integer>
成为StringNotificationHelper extends NotificationHelper<String>
, IntegerNotficationHelper extends NotificationHelper<Integer>
.这是《清洁代码》一书中推荐的做法。
您不需要将所有注入(inject)点都写在 ApplicationComponent 中,您可以创建与项目中依赖项的消费模式相对应的子组件。
(披露:作为目前正在尝试将项目从 Roboguice 迁移到 Dagger 2 的人,我对您的投诉表示同情)
关于android - Dagger2 注入(inject)大量的activity/fragments/services(可能得到大量的NPE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40206831/
在 C# 及其同类语言中,我们总是使用 public string SomeString { get; set;} 但是你也可以使用(我最近才发现这个,而且是在和编译器闲逛的时候发现的) public
我已经为 Controller 中的函数编写了 Swagger 注释,但在生成 swagger-ui 代码时出现错误。以下是我的注释代码 /*** End of Annotation For dele
我正在 PHP 中开发一项服务,该服务使用 exec 函数调用 jar 文件,如下所示: $text = "string with accents á, ó, ú or العربية"; exec(
我正在尝试了解有关在程序中利用/防止缓冲区溢出的方法的更多信息。我知道如果大小是恒定的,下面的代码很容易受到攻击,但是如果大小每次都是随机的怎么办?是否还有办法从堆栈中获取它并以某种方式动态改变溢出字
对于一项学校作业,我应该制作一个可以以小时、分钟和秒为单位存储时间的时间类。一切正常,但仅声明 get 时属性总是返回 0;并设置; private int seconds, minutes, hou
我正在遍历一些测验对象并将结果存储到json变量中。出现"ReferenceError is not defined"错误,不确定原因。 JS代码 // This function will send
使用 Nifi 的 PutDatabaseRecord 处理器在 MySQL 中插入阿拉伯字符(非拉丁语)时,字符被“??????”替换 插入后,阿拉伯字符串被替换为??????。我已经使用 utf8
谁能告诉我为什么 gets(abc) 使用 char[] 而不是使用 int? int abc; char name[] = "lolrofl"; printf("Hello %s.\n",na
为什么在使用 as.POSIXct 转换下面的时间戳时得到所有 NA? > head(tmp$timestamp_utc) [1] Fri Jul 03 00:15:00 EDT 2015 Fri J
def get_submultiples(n): # Get all submultiples of n if n == 1: return [1] i = 2
有没有办法访问基本模型的实际 child ,意思是:继续使用 django Docs 中的示例,让我们假设我正在建模不同的外卖餐厅,它们只是有共同点 姓名 都有deliver方法 至此: class
我正在寻找一个范围的总和,但我总是得到“未定义”。我相信有些东西出现在错误的位置,但我不确定它是什么。 第 1 部分:“编写一个范围函数,它接受两个参数(start 和 end),并返回一个包含从 s
我已将 spring 版本从 4.2.3 更新到 5.0.2,并将安全性从 5.0.1 更新到 5.0.10 并使用 spring -flex版本1.6.0.RC1。 像这样使用 BlazeDS 依赖
我可以输入但在输出中,我得到的结果为零。我使用两门类(class),一门是主要的,是日志,另一门是成绩计算。在成绩计算器中,我编写了方法和构造函数,在日志中,类通过构造函数调用这些方法。 import
我在使用 go 时遇到了构建问题。我想知道这是编译器中的错误还是代码的问题。 // removed the error handling for sake of clarity file, _ :=
我的角色在与盒子互动时出现问题。我有一个 GameObject Player 附加了一个脚本来与游戏中的盒子交互,脚本是: using UnityEngine; using System.Collec
有谁知道为什么我不能在下面生成百分比 codeIshere (第 97-117 行)? var format=d3.format(".1%"); var percent = format(functi
我正在尝试编写图像识别代码,以针对不同动物图像训练系统,这就是代码。我使用 anaconda 作为解释器,使用pycharm作为环境。 import tensorflow as tf import o
我正在尝试在 Java 中初始化 Matcher,但无论字符串是否已初始化且不为 null,都会继续获取 NPE。 这是代码: pattern.compile("\\s"); System.out.p
所以我有这段代码: ; (function (g) { var d = document, i, am = d.createElement('script'), h = d.head || d.g
我是一名优秀的程序员,十分优秀!