【发布时间】:2021-02-07 22:06:24
【问题描述】:
我一直在学习依赖注入,现在我已经在 dart 中实现了一个示例。但是我遇到了 get_it 包的问题。代码如下:
'MessageService.dart'
abstract class MessageService {
void sendMessage(String msg, String rec);
}
class EmailServiceImpl implements MessageService {
@override
void sendMessage(String message, String receiver) {
//logic to send email
print("Email sent to $receiver with message $message.");
}
}
class SMSServiceImpl implements MessageService {
@override
void sendMessage(String message, String receiver) {
//logic to send SMS
print("SMS sent to $receiver with message $message.");
}
}
'injection_container.dart'
import 'package:get_it/get_it.dart';
import 'MessageService.dart';
import 'main.dart';
final getIt = GetIt.instance;
void init() async {
getIt.registerFactory<Client>(() => Client());
getIt.registerFactory<MyApplication>(() => MyApplication(EmailServiceImpl()));
getIt.registerFactory<MessageService>(() => EmailServiceImpl());
getIt.registerFactory<MessageService>(() => SMSServiceImpl());
}
'main.dart'
import 'MessageService.dart';
import 'injection_container.dart' as di;
void main() {
di.init();
di.getIt<Client>().send();
}
class MyApplication {
MessageService _service;
MyApplication(this._service);
void processMessages(String msg, String rec) {
//do some msg validation, manipulation logic etc
this._service.sendMessage(msg, rec);
}
}
class Client {
void send() {
MyApplication app = di.getIt<MyApplication>();
app.processMessages("Hi Bill", "bill@abc.com");
}
}
但是当在 injection_container.dart 中同时注册 EmailServiceImpl 和 SMSServiceImpl 时,它给我一个错误:未处理的异常:无效参数:类型为 MessageService 的对象/工厂已在 GetIt 中注册。
如果我注释掉 SMSServiceImpl 注册它工作正常。有人可以告诉你有什么问题吗? 如果有人可以查看我的依赖注入示例,那将会很有帮助。它是呈现依赖注入的正确方式吗?
【问题讨论】:
-
为什么要把这两个服务都定义为getit中的MessageService。你想如何得到一个与另一个?
-
我想如果我们想扩展我们的应用程序以提供/替换额外的消息传递功能,例如 SMS,那么我们只需在注入器文件中更改它。通过上述方法获得依赖是我知道的唯一方法。我不知道这是否正确。如果不是,请告诉正确的。
-
这两个服务都定义为 MessageService,因为 MyApplication 具有 MessageService 类型的依赖项。所以你必须提到这些服务的类型。因此在 get_it 中提供了 MessageService。
标签: flutter dart dependency-injection