问题描述
从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依赖于服务,该服务通过相同的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,environmentFilter);
gh.factory<UserService>(() => UserService());
gh.factory<TravellerProfileviewmodel>(
() => TravellerProfileviewmodel(userService: get<UserService>()));
return get;
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)