انتخاب در برنامه های چند ماژول

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

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

انتخاب در ماژول های ویژگی

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

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

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

مثالی از صفحه Dependency injection with 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 مراجعه کنید.