1

注文のリストとウィッシュリストを持っているクライアントがいるとしましょう。私のモデルでは、ClientRepoOrderRepo、および がありWishListRepoます。コントローラでは、これらのリポジトリをどこでインスタンス化する必要がありますか? それらをクラスレベルのインスタンスにするのは良い考えですか?

component ClientController
{
    ClientRepo = new ClientRepo();
    OrderRepo = new OrderRepo();
    WishListRepo = new WishListRepo();

    public void function HomePage(any event)
    {
        var clientId = event.getValue("id");
        var client = ClientRepo.getClientById(clientId);
        var orders = OrderRepo.getOrdersForClientId(clientId);

        // put the variables into the event object for the view to access
    }
}

または、関数内でそれらをインスタンス化することをお勧めしますか?

public void function HomePage(any event)
{
    var ClientRepo = new ClientRepo();
    var orderRepo = new OrderRepo();
    var wishListRepo = new WishListRepo();

    // rest of the code is the same
}

ここでの前提は、他の関数がClientController同じリポジトリにアクセスする必要があるということです。

また、コントローラーの寿命は?リクエストごと、セッションごと、またはアプリケーションごとに 1 回ですか?

4

1 に答える 1

3

開示:私はModel-Glueプロジェクトの貢献者なので、おそらく私が話していることを知っています:-)

CFML には、Java のような真のクラスレベルのインスタンスはありません。シングルトン (アプリケーションの多くの部分で共有される単一のインスタンス) が必要な場合は、それを共有スコープ (yuk!) に配置するか、Bean コンテナーを使用する必要があります。幸いなことに、Model-Glue は ColdSpring (CFML の一般的な Bean コンテナー) と緊密に統合されており、Model-Glue 3 を使用すると、コントローラーで ColdSpring Bean をこれまで以上に簡単に使用できます。

まず、ColdSpring.xml を編集して、シングルトンの定義を含めます。

<bean id="ClientRepo" class="MyApp.model.client.ClientRepo"/>
<bean id="OrderRepo" class="MyApp.model.order.OrderRepo"/>

もちろん、これは単純な例にすぎません。ColdSpring は、Java の Spring に基づく強力な依存性注入フレームワークです。ColdSpring のクイックスタートをチェックして、ColdSpringでできるその他のことを確認してください。

Bean が ColdSpring で定義されたら、getModelGlue().getBean() 呼び出しを介してコントローラーに明示的に要求させることができます。ただし、より良い方法は、それらの Bean に対するコントローラーの依存関係を宣言し、Model-Glue がそれらをコントローラーに注入できるようにすることです。依存関係は、ModelGlue.xml またはコントローラー CFC で宣言できます。コントローラーで Bean の依存関係を宣言する方法は次のとおりです。

component ClientController beans="ClientRepo,OrderRepo"
{
    public void function HomePage(any event)
    {
        var clientId = event.getValue("id");
        var client = beans.ClientRepo.getClientById(clientId);
        var orders = beans.OrderRepo.getOrdersForClientId(clientId);

        // put the variables into the event object for the view to access
    }
}

宣言された Bean はすべて、フレームワークによってコントローラーの「beans」スコープに注入されるため、リスナー関数ですぐに使用できます。ただし、Bean インジェクションは初期化後に発生するため、init() 関数では使用できないことに注意してください。

ColdSpring Bean はデフォルトでシングルトンであるため、同じ ColdSpring Bean が複数のコントローラーに注入されると、それらはすべて Bean の同じインスタンスになります。Bean 定義に singleton="false" を追加すると、各コントローラーはそれぞれ異なるインスタンスになります。なぜそれをしたいのか、私には思いつきません。

Model-Glue での Bean インジェクションの詳細については、Model-Glue WikiのBean Injection HOWTOを参照してください。

Model-Glue 3.1 は、フレームワークの初期化時にすべてのコントローラーをシングルトンとしてインスタンス化するため、各コントローラーはアプリケーションごとに 1 回作成されます。将来のバージョンでは、最初に必要になるまでコントローラーのインスタンス化が遅れる可能性があるため、コントローラーがいつ初期化されるかを想定しないことをお勧めします。アプリケーションの初期化時にコントローラーでコードを実行する必要がある場合は、onApplicationStart リスナーを追加することをお勧めします。

于 2011-09-03T04:00:02.917 に答える