2017-01-13 4 views
1

di.dartパッケージを使用してデータベース接続をクラスに注入する際に問題があります。具体的には、toFactoryオプションで非同期依存関係を解決します。 どちらの試みは非同期ファクトリの依存性注入の分解能

NoSuchMethodError: Class '_Future' has no instance method 'query'.

エラーが発生し、それが正しいパス前方不明です。私はconnプロパティを未来にラップすることなく保持したいと考えています。私は、クラスコンストラクタでFutureのアンラップを試みましたが、現時点ではDartでは非同期コンストラクタは使用できません。

import 'package:postgresql/pool.dart'; 
import 'package:postgresql/postgresql.dart'; 
import 'package:di/di.dart'; 

main() async { 
    var uri = "postgres://username:[email protected]: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; 
    } 
} 

答えて

0

私は再現することができますが、私は

var conn = await injector.get(Connection); 
var res = await conn.query("select 1").toList(); 

に行を変更したときにそれが正常に動作します。

あなたのコードもうまくいくはずです。

+0

これは、私が残した「res1」の例とほぼ同じです。私が理解できないことは、Queryクラスへの非同期Connection依存関係を取得する方法です。 – jonahgeorge

+0

もちろん、このようにしてもエラーは発生しませんでしたが、1行のコードではエラーは発生しませんでした。 –

+0

これは私の問題を説明するための単純化された例でした。実際には、コンストラクタにQueryを受け入れるControllerクラスがあり、Queryクラスは単なるコード行を実行するだけではありません。 'injector.get(Connection)'から返される未来をアンラッピングすることは、クエリのコンストラクタで(Asyncであるため)実行できません。 'toFactory:'の非同期の問題のために、 'main()'で行うこともできません。 'toFactory:'の中で未来を解くためにわからないテクニックがあるなら、解決された 'Connection'がDIを通して渡せるようにするのは興味があります。 – jonahgeorge