依存性注入(4)-完全な映画アプリ
9599 ワード
依存性注入
ようこそ.
我々は最高のコーディングの練習とツールをそこにムービーアプリケーションを構築している.前もって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
いくつかの別々の依存関係プロバイダーに依存することができ、必要に応じて適切な依存性を提供することができれば、どのように良いでしょうか?この依存関係プロバイダーはまた、アプリケーション全体で単一のインスタンスと同様に怠惰な初期化を維持します.
まったく同じ目的のためにオープンソースの貢献者によって作成されたフラッタに多くのプラグインがあります.このシリーズでは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 ongetItInstance()
to provideClient
toApiClient
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()));
MovieRepository
, それはgetitによって解決されます.MovieRepository
依存するMovieRemoteDataSource
, それはgetitによって解決されます.メインを開きます.ダーツではなく、我々は以前の記事では、この時間だけで使用した初期化の多くの代わりに
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>();
unawaited
これは、アプリケーションが最初のフレームを起動する前に発生するgetit初期化を待つことができます.unawaited
を呼び出し、init()
getitの初期化方法<GetTrending>
はい.GetItは、私たちに必要な依存をインジェクションします.これはすべて、依存性注入のためにgetitを使用することでした.シリーズの次の部分でお会いしましょう.
この投稿は当初公表されたMedium .
あなたが記事の何でも愛したならば、私に続くのを忘れないでください🙏🏻. あなたは私に手を差し伸べることができます.GitHub , .
Reference
この問題について(依存性注入(4)-完全な映画アプリ), 我々は、より多くの情報をここで見つけました https://dev.to/prateeksharma1712/complete-movie-app-dependency-injection-4-4390テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol