使用 GetIt 进行构造函数注入

问题描述 投票:0回答:1

我一般编写 C# 企业 webdev 代码,并且很熟悉 DI,一般使用

Microsoft.DependencyInjection

现在,我正在尝试为 Flutter 项目设置 DI,

GetIt
似乎是首选框架。

但是注册感觉好冗长,感觉好像漏掉了什么。

出于多种原因,我不想走全局服务解析器路径。

那么,我真的必须用这样显式获取的每个依赖项来注册所有内容吗?

getIt.registerSingleton<MainLayout>(MainLayout(GetIt.instance<PageDefinitionProvider>()));

而不是仅仅拥有

getIt.registerSingleton<MainLayout>()
并且容器会为我递归地解析
MainLayout
的所有依赖项?

现在,我知道 Flutter/Dart 已经没有反射很长时间了,但肯定有比这更好的方法。

flutter dart dependency-injection
1个回答
0
投票

依赖注入 (DI) 通常使用 get_itproviderkiwi 等库进行管理。虽然这些库提供了强大的 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>()));

这种方法将注册逻辑封装在扩展方法中,使得注册具有依赖关系的类变得更加容易。

© www.soinside.com 2019 - 2024. All rights reserved.