我一般编写 C# 企业 webdev 代码,并且很熟悉 DI,一般使用
Microsoft.DependencyInjection
。
现在,我正在尝试为 Flutter 项目设置 DI,
GetIt
似乎是首选框架。
但是注册感觉好冗长,感觉好像漏掉了什么。
出于多种原因,我不想走全局服务解析器路径。
那么,我真的必须用这样显式获取的每个依赖项来注册所有内容吗?
getIt.registerSingleton<MainLayout>(MainLayout(GetIt.instance<PageDefinitionProvider>()));
而不是仅仅拥有
getIt.registerSingleton<MainLayout>()
并且容器会为我递归地解析 MainLayout
的所有依赖项?
现在,我知道 Flutter/Dart 已经没有反射很长时间了,但肯定有比这更好的方法。
依赖注入 (DI) 通常使用 get_it、provider 或 kiwi 等库进行管理。虽然这些库提供了强大的 DI 功能,但它们确实需要显式注册依赖项。但是,有一些方法可以简化注册过程并减少冗长。
这里有一些使用 get_it 简化 Flutter 中 DI 注册的建议:
使用命名构造函数:
// MainLayout class with a named constructor
class MainLayout {
final PageDefinitionProvider pageDefinitionProvider;
MainLayout(this.pageDefinitionProvider);
}
// Register MainLayout with get_it
getIt.registerSingleton<MainLayout>(
MainLayout(getIt<PageDefinitionProvider>()),
);
使用工厂构造函数:
考虑在类中使用工厂构造函数,以允许 get_it 实例化对象及其依赖项。
// MainLayout class with a factory constructor
class MainLayout {
final PageDefinitionProvider pageDefinitionProvider;
MainLayout._(this.pageDefinitionProvider);
factory MainLayout(getIt) => MainLayout._(getIt<PageDefinitionProvider>());
}
// Register MainLayout with get_it
getIt.registerFactory(() => MainLayout(getIt()));
工厂构造函数允许 get_it 在请求时创建类的实例,而不需要显式注册。
使用泛型和扩展:
您可以创建通用扩展方法来减少具有依赖项的类注册的冗长性。
extension GetItExtensions on GetIt {
void registerSingletonWithDependencies<T>(
T Function(GetIt) builder,
) {
registerSingleton<T>(builder(this));
}
}
// Usage:
getIt.registerSingletonWithDependencies<MainLayout>((getIt) =>
MainLayout(getIt<PageDefinitionProvider>()));
这种方法将注册逻辑封装在扩展方法中,使得注册具有依赖关系的类变得更加容易。