依存性注入(4)-完全な映画アプリ



依存性注入
ようこそ.
我々は最高のコーディングの練習とツールをそこにムービーアプリケーションを構築している.前もってDatasources and Repositories & UseCase , 私たちは多くのクラスを作成し、直接メインでインスタンス化しました.ダート.
この記事では、依存性注入(DI)とは何か、なぜDDIが必要なのか、どのようにしてFltterアプリケーションでDIを導入することができますか.

依存注入は何ですか?
DIを理解する前に、依存関係を最初に見ましょう.クラスAがクラスBを必要とするとき、クラスAはクラスBに依存します、そして、クラスBはクラスAのための依存として機能します.
これまでの依存関係と何が我々のコードに依存しているかを見ましょう.以下のコードを見てください.
ApiClient apiClient = ApiClient(Client());
MovieRemoteDataSource dataSource = MovieRemoteDataSourceImpl(apiClient);
MovieRepository movieRepository = MovieRepositoryImpl(dataSource);
GetTrending getTrending = GetTrending(movieRepository);
依存関係と依存関係:
  • ApiClient 依存するClient
  • MovieRemoteDataSource 依存するApiClient
  • MovieRepository 依存するMovieRemoteDataSource
  • GetTrending 依存するMovieRepository
  • すべてのUseCase呼び出しの場合、上記のような依存関係をすべてインスタンス化する必要があります.これはオーバーヘッドと任意の開発者のための生産時間の無駄です.これは時間の浪費であるだけではなく、より多くのメモリを消費することができる複数の場所で複数のオブジェクトを複数回作成することにもつながるかもしれません.
    いくつかの別々の依存関係プロバイダーに依存することができ、必要に応じて適切な依存性を提供することができれば、どのように良いでしょうか?この依存関係プロバイダーはまた、アプリケーション全体で単一のインスタンスと同様に怠惰な初期化を維持します.
    まったく同じ目的のためにオープンソースの貢献者によって作成されたフラッタに多くのプラグインがあります.このシリーズではgettle itプラグインを使います.

    ゲッケラ

    Open pubspec.yaml, add the below dependency and run flutter pub get command


    get_it: ^4.0.2
    

    In the di folder, create a new file get_it.dart


    輸入get_it ライブラリで、getitの静的インスタンスを変数で取得します.
    import 'package:get_it/get_it.dart';
    
    final getItInstance = GetIt.I;
    
    アプリケーションのコードの残りの部分については、現在使用しますgetItInstance . 我々の第2の記事/ビデオでは、我々はネットワークコールを作りました.
    GetCountに以下のコードを加えてください.初期化するダーツClient HTTPから:
    getItInstance.registerLazySingleton<Client>(() => Client());
    
  • <Client> getitにどのようなオブジェクトを登録するかを指定します.
  • () はファクトリ関数です.Client
  • => Client() 実際にデータソースを初期化します.これが方法です.
  • registerLazySingleton のインスタンスを初期化するClient ときは、最初のアプリケーションで使用されます.
  • ApiClient 依存するClient , それで、GetCountでそれを加えましょう.ダート
    getItInstance.registerLazySingleton<ApiClient>(() => ApiClient(getItInstance()));
    
  • getInstance() インApiClient(getItInstance()) apiclientの依存性を解決します.
  • As, we've asked GetIt to initialize Client for us, so we rely on getItInstance() to provide Client to ApiClient instance.

    MovieRemoteDataSource 依存するApiClient , それで、GetCountでそれを加えましょう.ダート
    getItInstance.registerLazySingleton<MovieRemoteDataSource>(
      () => MovieRemoteDataSourceImpl(getItInstance()));
    
    今まで、私はregisterLazySingleton() しかし、他の方法もあります.今度の記事で彼らに会います.以来Client , ApiClient , and MovieRemoteDataSource アプリケーション全体で使用されるので、アプリケーション全体で1つだけインスタンスが必要です.

    残りの例
    リポジトリとユースケースを宣言しましょう.getgetitを開きます.ダーツ宣言
    //1
    getItInstance.registerLazySingleton<GetTrending>(() => GetTrending(getItInstance()));
    getItInstance.registerLazySingleton<GetPopular>(() => GetPopular(getItInstance()));
    getItInstance.registerLazySingleton<GetPlayingNow>(() => GetPlayingNow(getItInstance()));
    getItInstance.registerLazySingleton<GetComingSoon>(() => GetComingSoon(getItInstance()));
    
    //2
    getItInstance.registerLazySingleton<MovieRepository>(() => MovieRepositoryImpl(getItInstance()));
    
  • すべてのusecaseは依存しているMovieRepository , それはgetitによって解決されます.
  • MovieRepository 依存するMovieRemoteDataSource , それはgetitによって解決されます.
  • GetCountですべてのオブジェクトを加えて、我々はします.ダーツ、メインでそれらを使用しましょう.ダート.
    メインを開きます.ダーツではなく、我々は以前の記事では、この時間だけで使用した初期化の多くの代わりにGetTrending からgetItInstance 現在
    //1
    import 'package:pedantic/pedantic.dart';
    //2
    import 'di/get_it.dart' as getIt;
    //3
    unawaited(getIt.init());
    //4
    GetTrending getTrending = getItInstance<GetTrending>();
    
  • pedanticパッケージの助けを借りてunawaited これは、アプリケーションが最初のフレームを起動する前に発生するgetit初期化を待つことができます.
  • getgetitファイルを作成します.
  • 用途unawaited を呼び出し、init() getitの初期化方法
  • 必要なインスタンスの種類を与えます<GetTrending> はい.
  • 今すぐアプリを実行し、再び出力の違いはありません.あなたがコンソールでトレンド映画のリストが表示されます.
    GetItは、私たちに必要な依存をインジェクションします.これはすべて、依存性注入のためにgetitを使用することでした.シリーズの次の部分でお会いしましょう.
    この投稿は当初公表されたMedium .
    あなたが記事の何でも愛したならば、私に続くのを忘れないでください🙏🏻. あなたは私に手を差し伸べることができます.GitHub , .