[英]Object Graphs and Singletons in Dagger
我只是从匕首开始,遇到了单例对象的一些问题。
所以Singleton看起来像这样:
@Module(
injects = {MainActivity.class,SecondActivity.class}
)
public class MySingle {
//just to count the number of instances of the class
public static int thecount=0;
//the constructor
public MySingle(){
Log.v("testing","created");
thecount++;
}
@Singleton
@Provides
public MySingle getSingle(){
return new MySingle();
}
}
创建对象图的Application类:
public class MyApplication extends Application {
private ObjectGraph objectGraph;
@Override
public void onCreate(){
super.onCreate();
objectGraph=ObjectGraph.create(new MySingle());
}
public ObjectGraph getObjectGraph(){
return objectGraph;
}
}
MainActivity.class:-
public class MainActivity extends ActionBarActivity {
@Inject MySingle mysingle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// MyApplication app=(MyApplication)getApplication();
// app.getObjectGraph().inject(this);
Log.v("testing", mysingle.thecount + " mainact");
}
}
因此,每当运行此命令时,单例“ MySingle”的实例数为1,这很好。 但是,当我取消注释这些行时:
MyApplication app=(MyApplication)getApplication();
app.getObjectGraph().inject(this);
我得到的实例数为2。从这里我了解到Dagger为每个对象图创建了一个单例,但是根据我的理解,通过使用以上两行,我将MainActivity.class注入到现有的对象图中,显然是到目前为止,对我来说这还不明显。我只是在尝试它。
但是根据我对以上两行的理解,我正在将MainActivity.class注入现有的对象图中
否。您正在将依赖项注入MainActivity。 您的模块既是匕首模块又是依赖项:)首先在Application onCreate方法中创建MySingle,第二次在注入期间创建MySingle。
@Module批注应该在提供依赖项的类上,并且您应该在此处提供依赖项。 例:
@Module(
injects = {MainActivity.class,SecondActivity.class}
)
public class DependencyModule {
@Singleton
@Provides
public Repository getSingle(){
return new InMemoryRepository();
}
}
一些界面:
public interface Repository {
List<String> getAllStrings();
}
其实现:
public class InMemoryRepository implements Repository {
@Override
List<String> getAllStrings() {
// you can create this list as static list in constructor if you are not sure that it is really singleton :)
List<String> list = new ArrayList<String>();
list.add("Hello");
list.add("World");
return list;
}
}
而您的活动:
public class MainActivity extends ActionBarActivity {
@Inject Repository myRepository;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyApplication app=(MyApplication)getApplication();
app.getObjectGraph().inject(this);
Log.v("testing", repository.getAllString().get(0));
}
}
您可能有几种存储库的实现:使用数据库,内存,文件,并且只能创建其实现并通过模块将其绑定到存储库接口,而无需触摸活动代码! 使用匕首,您不仅可以将Activity插入任何类,
MySingle不应是@Module本身。 您正在使用new MySingle()自己创建模块,然后从ObjectGraph获取MySingle实例,就像您@Provides方法所说的那样,它也在调用new MyModule。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.