2011-01-20 6 views
0

簡単な答えはもちろん、サービスインターフェイスに開始メソッドを含めることです。サービス開始インターフェイスの設計

interface Service { 
    void start(); 
    OperationResult operation(parameters); 
    ... 
} 

これはもちろん、サービスのほとんどのユーザーがサービスの開始を気にせず、操作のようなメソッドを使用したいからです。

どのようにこの問題を解決しますか?私はサービスインタフェースを汚染することなく1つの大きな制限があるシンプルなソリューションを持っていますので、私は人々の提案を聞きたいと思います。

答えて

1

それとものを行う次に、サービスを起動し、おそらくサービスを終了することが必要なら、その機能サービスを開始しているかもしれないオブジェクトを供給するだけであるオブジェクトがあるはずそれを終了することを含めてサービスを使って何かをするのに使われます(おそらくIDisposableを介して最もよく処理される - 後者のアクション - "do-stuff"オブジェクトを無効にする必要があります)。

0

、いくつかの方法:それは

  • 構築しますたび

      は、サービスが開始されていない場合は、自動的にすべての方法からそれを起動し、不適切な使用方法
    • を示し、操作方法から、例外をスローし、それを起動し
    • 起動されていない場合は
  • +0

    これはあなたの答えですか?あなたは、互換性のない3つの異なる戦略を選んだのですが、なぜですか? –

    +0

    @mP画像全体を見るので、1つを選ぶのはあなた次第です。あなたが提供した情報は限られています。 – Bozho

    0

    などの実装の問題(start()メソッドなど)とactions(operation()メソッド)が混在していることが原因です。 Startは、呼び出し元ごとにインスタンスを作成することも、キャッシュされたインスタンスのようにシングルトンを作成することもできるため、実装上の問題です。呼び出し元は、メソッドをまったく呼び出す必要はありません。実際、開始メソッドを保持して明日の実装を実装すると、コードが既存のクライアントで機能しなくなる可能性があります。

    IMOの場合は、このインターフェイスからstartメソッドを取り除いて、呼び出し元が操作メソッドが最適なタスクを委任することを心配する必要があります。

    インプリメンテーションに対してstartメソッド(インターフェイスとは無関係な最適化ステップ)をプッシュすると、さまざまな方法で問題を解決できます。例えば、

    a。以前にoperation()メソッドで呼び出されていない場合は、start()を呼び出します。同期の問題に対処する必要があります。 b。あなたの実装オブジェクトのコンストラクタでstart()を呼び出し、それを使って終了します。

    +0

    開始が問題を遅らせることはできないという事実はありますか? –

    +0

    @mP開始メソッドを遅らせることができない場合は、欲張りで、コンストラクタで起動させたり、初期化とメソッドの使用の間のある時点で遅延して起動するいくつかの戦略を思いつくことができます。 startを呼び出す方法とタイミングについては、実装に依存します。 – guidothekp

    0

    消費者がスタートアップを呼び出すのを気にしたくない場合。スタートアップコードを保護されたメソッドに内部的に委譲することを検討することができます。これは、起動時に現在行っていることを遅延初期化します。以下のような:このような

    protected MyService getMyService() { 
        if(myService == null) { 
         myService = new MyServiceImpl(); 
         myService.startup(); 
        } 
        return idpPersistence; 
    } 
    

    コール方法:

    public String findByThis(String tag, String key) { 
        return getMyService().findThat(MyClass.class, column, key); 
    } 
    

    もちろんこれは、いくつかのトレードオフがあります。起動時にサービスが高価な場合は、最初の発信者が最初にヒットします。

    もう一つの選択肢は、静的{}ブロックを使用してこれらを実装することですが、当然のことながら時にはあまりテストできないこともあります。また、IOCパターンにも違反することがあるオブジェクト構築時にスタートアップルーチンを実行します。サービスインタフェースを追加したのは、内部のクライアントだったので、すべてのサービスを初期化して起動する準備が整ったからです。

    +0

    お返事ありがとうございますが、どの戦略を選択してください。これは一般的にはほとんどの場合最も優れています。 –

    関連する問題