Get it 라이브러리란?
- Dart 언어에서 의존성 주입을 위해 사용하는 도구이다.
- 스프링의 IoC 컨테이너와 다르게 서비스 로케이터로 구현되었다고 한다.
- 닷넷의 서비스 로케이터 스플랫을 Dart 로 포팅한 것이라고 한다.
서비스 로케이터 패턴이란?
- 서비스나 의존성을
get_it 에 수동으로 등록하고 필요할 때 코드의 어느 위치에서나 검색할 수 있다.
- 인스턴스를 쉽게 등록하고 사용할 수 있다.
등록 유형
- Factory: 요청될 때마다 새 인스턴스가 생성되도록 등록한다.
- Singleton: 매번 1개의 동일한 인스턴스를 반환한다.
- Lazy Singleton: Singleton 과 유사하지만, 처음 호출 때 인스턴스를 생성한다.
특징
- 비동기 지원: 비동기 팩토리 함수를 지원하여 인스턴스를 생성하는 동안 비동기 작업이 필요한 인스턴스를 사용할 수 있다.
- 범위 지정 인스턴스:
get_it 내에서 범위를 생성하여 개체의 다양한 수명을 관리할 수 있어 복잡한 애플리케이션에 유리하다.
- Flutter 와의 통합이 유리하다.
- 앱 아키텍처에서 비즈니스 로직과 UI 컴포넌트의 분리가 필요한 시나리오에서 유용하다.
- 디버깅 친화적: 서비스가 이미 등록되어 있는지 확인하는 등 디버깅에 유용한 기능을 제공한다.
레퍼런스
코드 예제
세팅
GetIt 을 이용해 여러가지 모델과 서비스를 등록한다.
import 'package:get_it/get_it.dart';
// This is your service locator
final getIt = GetIt.instance;
void setupLocator() {
// Register services
getIt.registerSingleton<AppModel>(AppModel());
getIt.registerLazySingleton<DatabaseService>(() => DatabaseServiceImpl());
getIt.registerFactory<HomeViewModel>(() => HomeViewModel());
}
class AppModel {
// Some app-wide logic or data
}
abstract class DatabaseService {
// Abstract database service
}
class DatabaseServiceImpl extends DatabaseService {
// Implementation of the database service
}
class HomeViewModel {
// A ViewModel for a home page or screen
}
이용하기
GetIt 에 등록한 모델과 서비스는 어디서든 사용할 수 있다.
- 타입으로 찾기 때문에 인터페이스를 통해 구체적인 구현에 액세스할 수 있다.
void main() {
setupLocator(); // Setting up the locator
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
// Accessing the singleton instance of AppModel
var appModel = getIt<AppModel>();
return MaterialApp(
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
// Accessing a new instance of HomeViewModel
var homeViewModel = getIt<HomeViewModel>();
return Scaffold(
appBar: AppBar(title: Text("Home")),
body: Container(/* ... */),
);
}
}