2

Cake パターンを使用して SearchService の抽象化を作成しようとしています。これは私が現在持っているものです:

trait SearchServiceComponent{
  val searchService:SearchService

  trait SearchService{
      def searchForSomething(..):List[String]
      def updateIndex(..):Boolean
  } 
}

次のように、DbSearchServiceComponent と LuceneSearchServiceComponent があるとします。

trait DbSearchServiceComponent extends SearchServiceComponent{
   class DbSearchService extends SearchService{
           //Initialize the db client
           //Implement all the trait methods
   }
}

同様に...

trait LuceneSearchServiceComponent extends SearchServiceComponent{
  class LuceneSearchService extends SearchService{
     //Initialize the lucene client
     //Implement all the trait methods
  }
}

上記のスニペットで私が抱えている問題は、

Service 実装で lucene クライアントと db クライアントのインスタンスを初期化しました。

理想的には、Db クライアントまたは Lucene クライアントのいずれかになる「クライアント」基本タイプを「ミックスイン」したいのですが、ここでポリモーフィック クライアント タイプを注入する方法についてかなり混乱しています。

SearchService トレイトの実装にさまざまなバージョンのクライアントを挿入できるように、コードをリファクタリングする方法を誰かが指摘できますか?

4

1 に答える 1

2

あなたの質問を正しく解釈するかどうかはわかりませんが、ケーキパターンを使用する方法は次のとおりです。

trait SearchServiceComponent {
  val searchService: SearchService

  trait SearchService {
    def searchForSomething(...): List[String]
    def updateIndex(...): Boolean
  } 
}

trait DbSearchServiceComponent extends SearchServiceComponent {
   override val searchService = new SearchService {
    // Initialize client, implement methods
   }
}

trait trait LuceneSearchServiceComponent extends SearchServiceComponent {
   override val searchService = new SearchService {
    // Initialize client, implement methods
   }
}

インスタンス化時:

val myLucenceApp = new Whatever with LuceneSearchServiceComponent
val myDbApp = new Whatever with DbSearchServiceComponent

Whatever通常、どこに次のようなものがありますか

class Whatever { this: SearchServiceComponent =>
   // ... use `searchService` and do lots of other things
}
于 2014-01-21T08:54:23.417 に答える