繁体   English   中英

依赖注入问题,在Flutter获取

[英]Problem with Dependency Injection and Get It in Flutter

我一直在学习依赖注入,现在我已经在 dart 中实现了一个示例。但是我遇到了 get_it package 的问题。这是代码:

'消息服务.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 时,它给我的错误是:Unhandled Exception: Invalid argument(s): Object/factory with type MessageService is already registered inside GetIt.

如果我注释掉 SMSServiceImpl registration 它工作正常。 有人可以说出什么问题吗? 如果有人可以查看我的依赖注入示例,那将会很有帮助。 这是呈现依赖注入的正确方式吗?

getIt.registerFactory<MessageService>(() => EmailServiceImpl()); getIt.registerFactory<MessageService>(() => SMSServiceImpl());

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

因此,您的代码试图注册同一类型 (MessageService) 的两个实例。 来自 GetIt 文档

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

因此,当您调用 GetIt.I.get() 时,它不会知道它是 EmailServiceImpl 还是 SMSServiceImpl

试试这个

getIt.registerFactory<EmailServiceImpl>(() => EmailServiceImpl()); getIt.registerFactory<SMSServiceImpl>(() => SMSServiceImpl());

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

GetIt.I.allowReassignment = true

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM