2016-05-25 10 views
4

私は理解できません。もし私がimportをAureliaで使用できるのであれば、どうしてコンストラクタを@autoinject()と一緒に配線しなければならないのですか?私は何かが欠けていると確信していますが、私が知る限りでは、いつでも私のインポートしたモジュールを使用できます。Aureliaが "import"を理解している場合、なぜ依存性注入を使用するのですか?

import something from "whatever" 

export class SomeViewModel { 
    activate() { 
     // use something 
    } 
} 
+0

依存性注入は良いことであり、モジュールと直交しています。モジュール上にDIを実装するシステムは存在しないため、コンストラクタに対してもそれを行います。 – Bergi

答えて

5

技術的には、AureliaのDIを使用せずにインポートしたモジュールを使用することはできますが、ほとんどの状況では悪いことになります。 Dependency Injectionレイヤは、多用途性と柔軟性を提供します。それはキャッシングを処理し、シングルトンと一時的な依存性をサポートし、生​​涯を処理し、建築的な観点から素早く処理します。

11

通常、Aureliaアプリケーションでは、importSomethingのインスタンスではありません。これはクラスSomethingです。 import edのものを実際に使用するには、そのインスタンスが必要です。

import Something from 'whatever'; 

let something = new Something(); 

AureliaのDependency Injectionシステムを使用するときは、「Inversion of Control」というデザインパターンを使用しています。あなたのクラス(またはあなた)がその依存関係をインスタンス化するのではなく、それが持つ依存関係をリストし、そのコンストラクター関数に依存関係のインスタンスを挿入します。

これはテスト依存性の模擬インスタンスをテストフィクスチャのクラスに渡すことができるようになりました(テストでは、テストはモックをコンストラクタに渡し、AureliaのDIコンテナに依存しませんこれにより、依存関係注入コンテナのシングルトンやトランジェントなどのさまざまなオブジェクトライフスタイルを使用して依存関係を作成するように設定できるようになります。

は---私はコンストラクタ・インジェクションを使用して オーレリア・ビュー・モデルへのエクスポートデフォルトのクラスのものとして定義されたモジュールをインポートする場合、それはする必要はありません

---コメントからのOPの質問に答えるために編集します がインスタンス化されます。これは、Somethingクラスのインスタンスです。

これは、AureliaのDependency Injectionコンテナがインスタンスをインスタンス化しているためです。 、

import {inject} from 'aurelia-framework'; 
import Something from 'somewhere'; 

@inject(Something) 
export class Foo { 
    constructor(something) { 
    this.something = something; 
    } 
    //... 
} 

としない

import Something from 'somewhere'; 
export class Foo { 
    constructor(Something) { 
    this.something = something; 
    } 
    //... 
} 

あなたはオーレリアを言っている「私はこれらのいずれかが、私にそれを与えてください必要があります」とアウレリアは「確実なことは言う:これはあなたのコードは次のようになります理由です私は1つを作成した、または私は既に1つの周りに横たわっていた、ここはそれです。

つまり、aureliaのコンストラクタDIは、クラスエクスポートを使用して しか動作せず、クラスをインスタンス化するように見えます。それは のように私のaureliaビュー モデルにモーメントjsのようなものをインポートしたい場合は、私はいつもやったことをやっておくべきです (aureliaのDIを使用していない)。それは正しいと思いますか?

これは正しいです。 momentのようなライブラリは、Aureliaがインスタンス化できるクラスではなく、使用する関数を提供します。これらのために、あなたは過去のようにそれらを使い続けるでしょう。

+0

"通常、Aureliaアプリケーションでは、インポートしているものは、何かのインスタンスではありません。Something" これは真実ではありません。 'export default class Something'として定義されたモジュールを、コンストラクタインジェクションを使ってaureliaビューモデルに'インポート 'すると、インスタンス化する必要はありません。これは、クラス「Something」のインスタンスです。 aureliaのDI機能を決定するテストとして、「デフォルトの関数を何にでもエクスポートする」という定義のモジュールをaureliaビューモデルにインポートしようとしましたが、aureliaのDIで動作させる方法を理解できませんでした。 –

+0

つまり、aureliaのコンストラクタDIはクラスのエクスポートでのみ機能し、クラスをインスタンス化するように見えます。 私はaureliaビューモデルにmoment jsのようなものをインポートしたいと思っています。私はいつもそれらをやっているように(aureliaのDIを使用しないで)やり続けなければなりません。それは正しいと思いますか? –

+0

私は上記の答えでこれらの質問に答えました。 –

関連する問題