Hilt در برنامه‌های چندماژولی

تولید کد Hilt به دسترسی به همه پیمانه‌های Gradle که از Hilt استفاده می‌کنند نیاز دارد. ماژول Gradle که کلاس Application شما را کامپایل می‌کند باید همه ماژول‌های Hilt و کلاس‌های تزریق‌شده سازنده را در وابستگی‌های متعدی خود داشته باشد.

اگر پروژه چندماژولی شما از ماژول‌های Gradle معمولی تشکیل شده است، می‌توانید از Hilt همان‌طور که در تزریق وابستگی با Hilt توضیح داده شده است استفاده کنید. اما این موضوع درباره برنامه‌هایی که شامل واحد ویژگی هستند صدق نمی‌کند.

Hilt در واحدهای ویژگی

در واحدهای ویژگی، نحوه وابستگی واحدها به یکدیگر معمولاً معکوس است. بنابراین، Hilt نمی‌تواند حاشیه‌نویسی‌ها را در واحدهای ویژگی پردازش کند. باید از Dagger برای انجام تزریق وابستگی در واحد‌های ویژگی‌تان استفاده کنید.

برای حل این مشکل با واحدهای ویژگی، باید از وابستگی‌های مؤلفه استفاده کنید. این مراحل را دنبال کنید:

  1. یک @EntryPoint میانای در واحد app (یا در هر واحد دیگری که می‌تواند توسط Hilt پردازش شود) با وابستگی‌هایی که واحد ویژگی نیاز دارد، اعلام کنید.
  2. یک مؤلفه Dagger ایجاد کنید که به واسط @EntryPoint وابسته باشد.
  3. از Dagger مثل همیشه در واحد ویژگی استفاده کنید.

نمونه صفحه تزریق وابستگی با Hilt را درنظر بگیرید. فرض کنید یک واحد ویژگی login به پروژه‌تان اضافه می‌کنید. ویژگی ورود به سیستم را با فعالیتی به‌نام LoginActivity پیاده‌سازی می‌کنید. این یعنی فقط از مؤلفه برنامه می‌توانید اتصال‌ها را دریافت کنید.

برای این ویژگی، به OkHttpClient با اتصال authInterceptor نیاز دارید.

ابتدا، میانای @EntryPoint نصب‌شده در SingletonComponent را با اتصال‌هایی که مدول login نیاز دارد ایجاد کنید:

کاتلین

// LoginModuleDependencies.kt - File in the app module.

@EntryPoint
@InstallIn(SingletonComponent::class)
interface LoginModuleDependencies {

  @AuthInterceptorOkHttpClient
  fun okHttpClient(): OkHttpClient
}

جاوا

// LoginModuleDependencies.java - File in the app module.

@EntryPoint
@InstallIn(SingletonComponent.class)
public interface LoginModuleDependencies {

  @AuthInterceptorOkHttpClient
  OkHttpClient okHttpClient();
}

برای انجام تزریق فیلد در LoginActivity، یک مؤلفه Dagger ایجاد کنید که به میانای @EntryPoint وابسته باشد:

کاتلین

// LoginComponent.kt - File in the login module.

@Component(dependencies = [LoginModuleDependencies::class])
interface LoginComponent {

  fun inject(activity: LoginActivity)

  @Component.Builder
  interface Builder {
    fun context(@BindsInstance context: Context): Builder
    fun appDependencies(loginModuleDependencies: LoginModuleDependencies): Builder
    fun build(): LoginComponent
  }
}

جاوا

// LoginComponent.java - File in the login module.

@Component(dependencies = LoginModuleDependencies.class)
public interface LoginComponent {

  void inject(LoginActivity loginActivity);

  @Component.Builder
  interface Builder {
    Builder context(@BindsInstance Context context);
    Builder appDependencies(LoginModuleDependencies loginModuleDependencies);
    LoginComponent build();
  }
}

پس‌از تکمیل این مراحل، از Dagger مثل همیشه در واحد ویژگی‌تان استفاده کنید. برای مثال، می‌توانید از اتصال‌های SingletonComponent به‌عنوان وابستگی کلاس استفاده کنید:

کاتلین

// LoginAnalyticsAdapter.kt - File in the login module.

class LoginAnalyticsAdapter @Inject constructor(
  @AuthInterceptorOkHttpClient okHttpClient: OkHttpClient
) { ... }

جاوا

// LoginAnalyticsAdapter.java - File in the login module.

public class LoginAnalyticsAdapter {

  private final OkHttpClient okHttpClient;

  @Inject
  LoginAnalyticsAdapter(
    @AuthInterceptorOkHttpClient OkHttpClient okHttpClient
  ) {
    this.okHttpClient = okHttpClient;
  }
  ...
}

برای انجام تزریق فیلد، نمونه‌ای از مؤلفه Dagger بااستفاده از applicationContext ایجاد کنید تا وابستگی‌های SingletonComponent را دریافت کنید:

کاتلین

// LoginActivity.kt - File in the login module.

class LoginActivity : AppCompatActivity() {

  @Inject
  lateinit var loginAnalyticsAdapter: LoginAnalyticsAdapter

  override fun onCreate(savedInstanceState: Bundle?) {
    DaggerLoginComponent.builder()
        .context(this)
        .appDependencies(
          EntryPointAccessors.fromApplication(
            applicationContext,
            LoginModuleDependencies::class.java
          )
        )
        .build()
        .inject(this)

    super.onCreate(savedInstanceState)
    ...
  }
}

جاوا

// LoginActivity.java - File in the login module.

public class LoginActivity extends AppCompatActivity {

  @Inject
  LoginAnalyticsAdapter loginAnalyticsAdapter;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    DaggerLoginComponent.builder()
        .context(this)
        .appDependencies(
          EntryPointAccessors.fromApplication(
            getApplicationContext(),
            LoginModuleDependencies.class
          )
        )
        .build()
        .inject(this);

    super.onCreate(savedInstanceState);
    ...
  }
}

برای اطلاعات بیشتر درباره وابستگی‌های واحد در واحدهای ویژگی، به وابستگی‌های مؤلفه با واحدهای ویژگی مراجعه کنید.

برای کسب اطلاعات بیشتر درباره Dagger در Android، به استفاده کردن از Dagger در برنامه‌های Android مراجعه کنید.