恐龙

Dino 是一个 Dart 依赖注入库,可选代码生成。它受到了 .NET 中的 DI 的启发,旨在灵活、可预测且易于使用。

快速开始

假定您对 依赖注入 有基本了解。

假设我们有多个相互依赖的服务

class Repository {
  Repository(this.restClient);
  final RestClient restClient;

  Future<void> sendMessage(String message) async {
    try {
      await restClient.sendMessage(message);
    } catch (e) {
      print('Error sending message: $e');
    }
  }
}

class RestClient {
  RestClient(this.dio);
  final Dio dio;

  Future<void> sendMessage(String message) async {
    await dio.post('/api/message', data: {'message': message});
  }
}

那么它们在 dino 中的注册将如下所示

void main() {
  final ServiceCollection services = RuntimeServiceCollection();

  services.addInstance(Dio());

  services.addSingletonFactory(
    (sp) => RestClient(
      dio: sp.getRequired<Dio>(),
    ),
  );

  services.addSingletonFactory(
    (sp) => Repository(
      restClient: sp.getRequired<RestClient>(),
    ),
  );
}

如果我们使用 dino_generator 添加代码生成,那么代码将变得更漂亮

import 'main.dino.g.dart';

void main() {
  final ServiceCollection services = $ServiceCollection();

  services.addInstance(Dio());
  services.addSingleton<RestClient>();
  services.addSingleton<Repository>();
}

现在我们可以使用注册的服务了

final rootScope = services.buildRootScope();

final repository = rootScope.serviceProvider.getRequired<Repository>();
repository.sendMessage('Hello world!');

您还可以使用 dino_flutter 包在 flutter 中使用 dino

void main() {
  final ServiceCollection services = $ServiceCollection();

  services.addInstance(Dio());
  services.addSingleton<RestClient>();
  services.addSingleton<Repository>();

  final rootScope = services.buildRootScope();

  runApp(
    DinoProvider(
      serviceProvider: scope.serviceProvider,
      child: Application(),
    ),
  );
}

然后您可以使用 BuildContext 中的 ServiceProvider

class MyWisdget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final repository = context.serviceProvider.getRequired<Repository>();

    // build widget
  }
}

为了更好地理解 ServiceCollectionServiceScopeServiceProvider 等概念,并进一步了解 dino,您可以查看详细文档。

文档

贡献

欢迎 Pull requests。对于重大更改,请先打开一个 issue 来讨论您想进行的更改。

请确保适当地更新测试。

许可证

MIT

GitHub

查看 Github