【问题标题】:Problem with Dependency Injection and Get It in Flutter依赖注入的问题并在 Flutter 中获取
【发布时间】: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


【解决方案1】:

getIt.registerFactory&lt;MessageService&gt;(() =&gt; EmailServiceImpl()); getIt.registerFactory&lt;MessageService&gt;(() =&gt; SMSServiceImpl());

GetIt 只允许(默认情况下)一个类型的一个实例。

所以您的代码正在尝试注册两个相同类型的实例 (MessageService)。 来自 GetIt 文档

您必须传递一个工厂函数 func,该函数返回 T 实现的 NEW 实例。每次调用 get() 都会返回一个新实例。

所以当你调用 GetIt.I.get() 时,它不会知道它是 EmailServiceImpl 还是 SMSServiceImpl

试试这个

getIt.registerFactory&lt;EmailServiceImpl&gt;(() =&gt; EmailServiceImpl()); getIt.registerFactory&lt;SMSServiceImpl&gt;(() =&gt; SMSServiceImpl());

您还可以允许重新评估,以便您的代码按原样工作。

GetIt.I.allowReassignment = true

【讨论】:

  • 感谢您的回答。
猜你喜欢
  • 2015-11-21
  • 2020-10-25
  • 2016-05-18
  • 2014-12-27
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多