2014-01-21 2 views
2

Я пытаюсь создать абстракцию для SearchService с использованием шаблона Cake. Это то, что я в настоящее время:Тестирование клиента базы данных в шаблоне торта

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 
    } 
} 

Проблема у меня с вышесказанным является то, что

Я инициализировал экземпляры клиента lucene и клиента db в реализациях Service.

В идеале я хотел бы «смешивать в» а «Клиент» базовый тип, который может быть либо клиент Db или клиент Lucene, но я очень путать о том, как вводить тип здесь полиморфный клиент.

Может кто-нибудь указать, как я могу реорганизовать код, чтобы я мог вставлять разные версии клиента в мои реализации признака SearchService?

ответ

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 
} 
+0

Спасибо за пример. Я предполагаю, что это больше похоже на абстрагирование инициализации клиента для DB и Lucene. Поскольку у DB и Lucene есть разные клиентские реализации, я не могу придумать способ иметь абстрактный «клиент», который может использоваться как для DB, так и для Lucene. У меня есть эта жесткая зависимость от этих клиентов, с которыми я не могу обойтись. –

+1

[Daniel Spiewak] (http://www.youtube.com/watch?v=yLbdw06tKPQ) показывает хороший способ использования признаков для инициализации и выключения в [этом разговоре] (http://www.youtube.com/watch ? v = yLbdw06tKPQ). Что касается абстракции клиентов, я полагаю, вы работаете с такими объектами, как пользователи, службы и т. Д.? Они должны быть относительно легко абстрагироваться, независимо от DB или Lucene. Не могли бы вы привести пример? Боюсь, я до сих пор не получил то, что вам нужно (без обид). – fotNelton

Смежные вопросы