通过 di.dart 将数据库连接注入(inject)类时遇到一些问题包裹。具体来说,解决 toFactory
中的异步依赖。选项。
两次尝试都导致NoSuchMethodError: Class '_Future' has no instance method 'query'.
错误,目前还不清楚正确的前进道路。我宁愿保留 conn
没有被包裹在 Future 中的属性。我尝试在类构造函数中对 Future 进行解包,但此时 Dart 中不允许使用异步构造函数。
import 'package:postgresql/pool.dart';
import 'package:postgresql/postgresql.dart';
import 'package:di/di.dart';
main() async {
var uri = "postgres://username:password@localhost:5432/database";
var pool = new Pool(uri, minConnections: 2, maxConnections: 5);
await pool.start();
Module module = new Module();
module.bind(TestQuery);
module.bind(TestController);
module.bind(Pool, toValue: pool);
module.bind(Connection, toFactory: (pool) => pool.connect(), inject: [Pool]);
var injector = new ModuleInjector([module]);
var html = await injector.get(TestController).index();
print(html);
}
class BaseQuery {
Connection conn;
BaseQuery(Connection this.conn);
}
class TestQuery extends BaseQuery {
TestQuery(Connection conn) : super(conn); // type '_Future' is not a subtype of type 'Connection' of 'conn' where
run() async {
var results = await conn.query("select 1").toList();
// Do some data manipulation
return results;
}
}
class TestController {
TestQuery testQuery;
TestController(TestQuery this.testQuery);
index() async {
var results = await testQuery.run();
var html = "<pre>" + results.toString() + "</pre>";
return html;
}
}
最佳答案
我可以重现,但是当我将线路更改为
var conn = await injector.get(Connection);
var res = await conn.query("select 1").toList();
它工作正常。
我认为您的代码也应该可以正常工作。
关于dependency-injection - 异步工厂的依赖注入(inject)解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41625502/