从在 lib(dev) 代码中初始化的 getIt 中获取实例是否可以,或者我应该使用其他方式,还是使用其他 DI 设置进行测试?
请参考以下代码:
void main() {
TravellerProfileViewModel travellerProfileViewModel;
UserService mockUserService;
setUpAll(() {
// CoreInjector is initialised in lib, and gives the getIt instance
CoreInjector.initialize();
//register mockUserService in place of actual user service in the CoreInjector.getIt
mockUserService = registerAndGetMock<UserService>(MockUserService());
// CoreInjector gives TravellerProfileViewModel, injected with UserService
travellerProfileViewModel =
CoreInjector.getIt.get<TravellerProfileViewModel>();
});
}
T registerAndGetMock<T>(T mockAble) {
_removeRegistrationIfExists<T>();
CoreInjector.getIt.registerFactory<T>(() => mockAble);
return mockAble;
}
CoreInjector 代码
class CoreInjector {
static GetIt _getIt;
static GetIt get getIt => _getIt;
static void initialize() {
_getIt ??= _configureInjection();
}
}
@InjectableInit(preferRelativeImports: false)
GetIt _configureInjection() =>
$initGetIt(GetIt.asNewInstance());
TravellerProfileViewModel 依赖于 Service,该 Service 通过相同的 CoreInjector 在后台注入。
也可以进行构造函数注入,还是应该将构造函数参数设为可选?在以下两种方法中,更好的方法是什么?
@injectable
class TravellerProfileViewModel extends BaseViewModel {
final UserService _userService;
//injected by DI under the hood
TravellerProfileViewModel(this._userService);
}
可注入的生成代码:
GetIt $initGetIt(
GetIt get, {
String environment,
EnvironmentFilter environmentFilter,
}) {
final gh = GetItHelper(get, environment, environmentFilter);
gh.factory<UserService>(() => UserService());
gh.factory<TravellerProfileViewModel>(
() => TravellerProfileViewModel(get<UserService>()));
return get;
}
或者
@injectable
class TravellerProfileViewModel extends BaseViewModel {
UserService _userService;
//injected by DI under the hood, also gives liberty to pass optional params in case of
testing
TravellerProfileViewModel({UserService userService}){
_userService = userService?? CoreInjector.getIt.get<UserService>();
}
}
可注入的生成代码:
GetIt $initGetIt(
GetIt get, {
String environment,
EnvironmentFilter environmentFilter,
}) {
final gh = GetItHelper(get, environment, environmentFilter);
gh.factory<UserService>(() => UserService());
gh.factory<TravellerProfileViewModel>(
() => TravellerProfileViewModel(userService: get<UserService>()));
return get;
}