JJD*_*JJD 12 android dependency-injection static-classes dagger
我想通过Dagger向项目引入依赖注入.以下代码用作描述注入静态类的问题的示例.
setupTextView()
从多个类调用静态方法:
public abstract class TextViewHelper {
public static void setupTextView(TextView textView,
Spanned text,
TrackingPoint trackingPoint) {
textView.setText(text, TextView.BufferType.SPANNABLE);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyApp.getTracker().track(trackingPoint);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
以下是如何使用辅助方法的一个示例:
TextViewHelper.setupTextView(this, R.id.some_text_view,
R.string.some_text,
TrackingPoint.SomeTextClick);
Run Code Online (Sandbox Code Playgroud)
辅助方法中使用的跟踪由应用程序类提供:
public class MyApp extends Application {
private static Tracking mTracking;
public void onCreate() {
super.onCreate();
mTracking = getTracking(getApplicationContext());
}
private Tracking getTracking(Context context) {
if (BuildConfig.DEBUG) {
return new NoTracking();
} else {
return new NsaTracking(context);
}
}
public static Tracking getTracker() {
return mTracking;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我想通过Dagger注入跟踪.当我重构代码时,我注意到我需要将跟踪对象从我的Activity或Fragment传递给静态助手,因为我不能直接注入静态类:
TextViewHelper.setupTextView(this, R.id.some_text_view,
R.string.some_text,
TrackingPoint.SomeTextClick,
Tracking tracking);
Run Code Online (Sandbox Code Playgroud)
这不是一个好的设计模式 - 因为我传递了TrackPoint
和Tracking
对象.你会如何改善这一点?
tom*_*ozb 15
在您TextViewHelper
使用跟踪器创建静态字段.
public class TextViewHelper {
private TextViewHelper(){}
@Inject
static Tracking sTracker;
public static void setupTextView(TextView textView,
Spanned text,
TrackingPoint trackingPoint) {
textView.setText(text, TextView.BufferType.SPANNABLE);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sTracker.track(trackingPoint);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
以下是配置模块的方法:
@Module(staticInjections = TextViewHelper.class)
public class TrackerModule {
...
}
Run Code Online (Sandbox Code Playgroud)
最重要的是,在图表上调用injectStatics.
mObjectGraph = ObjectGraph.create(new TrackerModule());
mObjectGraph.injectStatics();
Run Code Online (Sandbox Code Playgroud)
编辑:
正如您所指出的那样,Dagger的文档指出静态注入"应该谨慎使用,因为静态依赖很难测试和重用." 这是真的,但是因为你问如何将对象注入实用程序类,这是最好的解决方案.
但是如果您希望代码更易于测试,请创建如下模块:
@Module(injects = {classes that utilizes TextViewHelper})
public class TrackerModule {
@Provides
Tracking provideTracker() {
...
}
@Provides
@Singleton
TextViewHelper provideTextViewHelper(Tracking tracker) {
return new TextViewHelper(tracker);
}
}
Run Code Online (Sandbox Code Playgroud)
现在您可以static
从TextViewHelper
方法中删除,因为将使用dagger注入此实用程序类.
public class TextViewHelper {
private final Tracking mTracker;
public TextViewHelper(Tracking tracker){
mTracker = tracker;
}
public void setupTextView(TextView textView,
Spanned text,
TrackingPoint trackingPoint) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
如果您想遵循良好实践,应该如何做.这两种解决方案都可以使用,因此您可以选择一种解决方案.
归档时间: |
|
查看次数: |
10232 次 |
最近记录: |