恐龙
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
}
}
为了更好地理解 ServiceCollection、ServiceScope 和 ServiceProvider 等概念,并进一步了解 dino,您可以查看详细文档。
文档
贡献
欢迎 Pull requests。对于重大更改,请先打开一个 issue 来讨论您想进行的更改。
请确保适当地更新测试。