在我的应用程序中,我试图创建Dagger2
组件
我已经创建了组件,并从应用程序类启动。
public class MyApp extends Application{
private ContextComponent mContextComponent;
private AppUtilComponent mAppUtilComponent;
private NetworkComponent mNetworkComponent;
@Override
public void onCreate() {
super.onCreate();
mNetworkComponent = createNetworkComponent();
mContextComponent = createContextComponent();
mAppUtilComponent = createAppUtilComponent();
}
private AppUtilComponent createAppUtilComponent() {
return DaggerAppUtilComponent.builder().appUtilModule(new AppUtilModule(this)).build();
}
public AppUtilComponent getAppUtilComponent() {
return mAppUtilComponent;
}
private NetworkComponent createNetworkComponent() {
return DaggerNetworkComponent.builder().networkModule(new NetworkModule()).build();
}
public NetworkComponent getNetworkComponent() {
return mNetworkComponent;
}
private ContextComponent createContextComponent() {
return DaggerContextComponent.builder().contextModule(new ContextModule(this)).build();
}
public ContextComponent getContextComponent(){
return mContextComponent;
}
}
ContextModule类如下所示
@Module
public class ContextModule {
private Context mContext;
public ContextModule(Context context){
mContext = context;
}
@Provides
@Singleton
Context getContext(){
return mContext;
}
}
上下文组件将是
@Singleton
@Component (modules = ContextModule.class)
public interface ContextComponent {
void inject(AppUtils appUtils);
}
@Singleton
@Component (modules = AppUtilModule.class)
public interface AppUtilComponent {
void inject(SplashActivity splashActivity);
}
@Module (includes = ContextModule.class)
public class AppUtilModule {
private AppUtils mAppUtils;
private Context context;
@Inject
public AppUtilModule(Context context) {
this.context = context;
}
@Provides
public AppUtils getAppUtil(){
mAppUtils = new AppUtils(context);
return mAppUtils;
}
}
public class AppUtils {
public Context mContext;
@Inject
public AppUtils(Context _context){
mContext = _context;
}
public boolean isNetworkConnected(){
//Using mContext to determine Network
}
... Other Utility methods which will be used throughout my application
}
public class SplashActivity ....
{
@Inject
public NetworkProcessor mNetworkProcessor;
.....
@Inject
public AppUtils mAppUtils;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyApp.getInstance().getAppUtilComponent().inject(this);
MyApp.getInstance().getNetworkComponent().inject(this);
}
}
错误:
rror: [Dagger/MissingBinding] com.dev.myapp.networking.NetworkProcessor cannot be provided without an @Inject constructor or an @Provides-annotated method.
com.dev.myapp.networking.NetworkProcessor is injected at
com.dev.myapp.ui.activities.landing.SplashActivity.mNetworkProcessor
com.dev.myapp.ui.activities.landing.SplashActivity is injected at
com.dev.myapp.components.AppUtilComponent.inject(com.dev.myapp.ui.activities.landing.SplashActivity)
因此,一个组件可以同时创建多个依赖项,这些依赖项通常按生存期范围分组(应用程序=整个应用程序生存期,活动=活动生存期)。
因此,如果AppUtils
类的作用域与ContextComponent
相同,则可以使用它将AppUtils注入到应该使用它的类中,例如一个活动:
public class MainActivity extens Activity {
@Inject AppUtils appUtils;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((MyApp) getApplication()).getContextComponent().inject(this);
}
}
将ContextComponent定义扩展为
@Singleton
@Component (modules = ContextModule.class)
public interface ContextComponent {
void inject(AppUtils appUtils);
void inject(MainActivity activity);
}
public class AppUtils {
private Context mContext;
@Inject
public AppUtils(Context context){
this.mContext = context;
}
}
Dagger不知道如何创建networkprocessor
-类,因此编译器出错。要使其工作,您应该更改NetworkProcessor
,使其具有一个用@inject
注释的构造函数,就像使用apputils
一样(第二个选项是在dagger模块中创建@provides
方法,但第一个解决方案更容易)。
您没有提供networkprocessor
的源代码,所以我在这里假设它只需要context
作为依赖项。
既然apputils
和networkprocessor
都有一个仅有context
作为参数的可注入构造函数,Dagger可以自己创建缺少的链接。
您不需要networkcomponent
和apputilcomponent
,只需要一个组件,所以删除它们。还要删除networkmodule
和apputilmodule
。ContextComponent
现在就足以将所有依赖项注入SplashActivity
:
public class SplashActivity .... {
@Inject public NetworkProcessor mNetworkProcessor;
.....
@Inject public AppUtils mAppUtils;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyApp.getInstance().getContextComponent().inject(this);
}
//...
}
这是因为Dagger可以自己创建布线代码,因为它知道如何实例化apputils
和networkprocessor
。
我对匕首2还不太熟悉。我正试图在我的Android项目中实现它。我有一个需要。我用匕首把它注射到这个服务中。 、和具有标记为的方法当我构建项目时,我收到以下错误: locationServiceComponent依赖于多个作用域组件:@Singleton NetComponent@Singleton RepositoryComponent 我知道我的不能依赖于两个作用域组件,但我的服务中需要这两个
Dagger 2即将面世,但可用的示例甚至无法立即编译,文档是Dagger 1的复制粘贴替换。 有没有人有一个在谷歌的Dagger 2上运行的正确应用程序的例子?
问题内容: 我已经搜索了很多,但是我发现的主要是python中的递归编程示例。因此,问题来了: 我该如何实现? 问题答案: 一切在Python中都是动态的-甚至是类声明。在初始声明之后,没有什么可以阻止您修改类的内容的: 注意:如果您不太熟悉Python,则该关键字仅允许您说“这里什么都没有”-除非A类的空值与本例中的一样空,否则它并不重要!
问题内容: 我可能错过了一些东西,但我认为像@Singleton这样的作用域用于定义“作用域生命周期”。 我在Android应用程序中使用了Dagger 2(但我认为问题根本与android相关)。 我有1个模块: 我有两个与范围不同的组件: 两者,并且,有一个构造函数。虽然MenuPresenter期望将其作为参数,但LoginPresenter却采用了: 但是每次我使用这些组件创建一个或时,都
我在android项目中使用Dagger2我有两个作用域:ActivityScope和FragmentScope我读了一些示例代码,他们说定义并使用ActivityScope,所以对象将在activity lifecycle中销毁。因为活动和片段有不同的生命周期,所以我们应该有两个作用域。 我的问题是:我是否需要做一些事情让代码知道,当我使用ActivityScope时,对象应该随活动生命周期一起
泽西正常使用HK2依赖注入,但我想用匕首2的泽西。Dagger和HK2都实现了JSR330,我认为这是不需要太多努力就可以实现的。我找到了让Jersey与CDI(例如Weld)、Spring DI和Guice一起工作的方法,但在Dagger上我找不到任何东西。 为了提供一些上下文:我正在SE环境中运行Grizzly-Jersey服务器,而不是在EE容器中。我的Maven项目有和作为依赖项,但没有,