2014-07-09 20 views
8

Bir projeye bağımlılık enjeksiyonunu Dagger aracılığıyla tanıtmak istiyorum. Aşağıdaki kod enjeksiyonunu statik sınıflarına tanımlamak için bir örnek olarak işlev görür.Hançer kullanarak statik sınıflar nasıl enjekte edilir?

statik yöntem setupTextView() birden sınıflardan denir:

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); 
      } 
     }); 
    } 
} 

Burada yardımcı yöntemi nasıl kullanıldığını bir örnek:

TextViewHelper.setupTextView(this, R.id.some_text_view, 
          R.string.some_text, 
          TrackingPoint.SomeTextClick); 

yardımcı yönteminde kullanılan izleme tarafından sağlanmaktadır uygulama sınıfı:

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; 
    } 

} 

Şimdi tr enjeksiyonu yapmak istiyorum Hançer ile acking.

TextViewHelper.setupTextView(this, R.id.some_text_view, 
          R.string.some_text, 
          TrackingPoint.SomeTextClick, 
          Tracking tracking); 

Bu iyi tasarım gibi hissetmez: Ben kodu refactored zaman doğrudan statik sınıfa enjekte edemez çünkü ben statik yardımcı benim Aktivite veya Fragment gelen izleme nesnesinin geçmesi gerekir fark desen - TrackPoint ve Tracking nesnesini geçtim. Bunu nasıl geliştirirsin?

+7

NsaTracking? -) – ligi

cevap

12

TextViewHelper'unuzda izleyici ile statik bir alan oluşturun.

@Module(staticInjections = TextViewHelper.class) 
public class TrackerModule { 
... 
} 

Ve grafikte en önemli, çağrı injectStatics: Burada

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); 
      } 
     }); 
    } 
} 

modülünü yapılandırmak nasıl.

mObjectGraph = ObjectGraph.create(new TrackerModule()); 
mObjectGraph.injectStatics(); 

Düzenleme:

Eğer Dagger belgelerine statik enjeksiyonları "statik bağımlılıkları test etmek ve yeniden zor olduğundan idareli kullanılması gerektiğini" belirtiyor belirtildiği gibi Her şey doğru, ancak nesneyi yardımcı program sınıfına nasıl enjekte edeceğinizi sorduğunuz için bu en iyi çözümdür.

Ama eğer kod daha test edilebilmelidir istiyorsanız, bir modül aşağıda gibi oluşturun: Bu yardımcı sınıf hançeri kullanarak enjekte edilecek çünkü

@Module(injects = {classes that utilizes TextViewHelper}) 
public class TrackerModule { 

     @Provides 
     Tracking provideTracker() { 
      ... 
     } 

     @Provides 
     @Singleton 
     TextViewHelper provideTextViewHelper(Tracking tracker) { 
      return new TextViewHelper(tracker); 
     } 
} 

Şimdi static TextViewHelper gelen yöntemler kaldırabilirsiniz.

public class TextViewHelper { 

    private final Tracking mTracker; 

    public TextViewHelper(Tracking tracker){ 
     mTracker = tracker; 
    } 

    public void setupTextView(TextView textView, 
           Spanned text, 
           TrackingPoint trackingPoint) { 
     ... 
    } 
} 

İyi uygulamaları takip etmek istiyorsanız bu nasıl yapılmalıdır. Her iki çözüm de işe yarayacak, bu yüzden birini seçmek size kalmış.

+1

** Statik enjeksiyonla ilgili olarak ** [Hançer dokümantasyonu] (http://square.github.io/dagger/#using) şunu belirtir: * "Bu özellik, durağan kullanıldığı için statik olarak kullanılmalıdır. bağımlılıkların test edilmesi ve yeniden kullanılması zordur. "*. Bunun iyi test edilebileceğini düşünüyor musunuz? – JJD

+0

Bence TextViewHelper, statik yöntemlerle bir sınıf olmamalıdır. Enjekte etmek için başka bir nesne olarak davranın, böylece artık statik enjeksiyona ihtiyacınız olmayacak. Modülünüzde Tracker, diğeri de TextViewHelper sağlayan iki yöntem oluşturun.TextViewHelper gerektiren bir sınıfta sadece @Inject ile bir alan oluşturun. Bu şekilde kodunuz süper test edilebilir ve statik enjeksiyona ihtiyacınız olmaz. – tomrozb