2016-06-12 2 views
1

У меня есть класс Апи с Dependency Injection, с функцией, которые используют этот инъекции:Play 2,5 SCALA класс импорта с Dependency Injection

class Api @Inject()(userRepo: UserRepo) extends Controller { 
    def user(email: String) ={ 
    userRepo.getUser(email).map(....) 
    } 
} 

и объект FlashSession в том же пакете - Я используя его во многих других файлах. Я хочу использовать функцию пользователь в мой объект FlashSession.

object FlashSession { 
    def test = ... Api.user("[email protected]") .... 
} 

Но я не могу импортировать Api класса, потому что это класс, а не объект, и я не могу поставить эту функцию в объект Компаньона, поскольку он нуждается в DI.

Что такое лучший способ справиться с этим?

Благодарим за помощь!

ответ

1

Вы можете создать этот Api класс внутри FlashSession

object FlashSession { 
    def test = new Api(new UserRepo()).user(...) 
} 

или

object FlashSession { 
    def test(userRepo: UserRepo) = new Api(userRepo).user(...) 
} 

Но это, вероятно, не то, что вы действительно хотите. Вы не должны использовать глобальные объекты-компаньоны с DI, особенно для обработки данных базы данных.

+1

Спасибо, но эффективно, это не совсем то, что я хотел, потому что я использую класс Api в качестве контроллера. Но я могу адаптировать ваш ответ и что-то сделать с ним. Что вы подразумеваете под «не использовать глобальные объекты-компаньоны с DI»? Это означает, что ваше решение не очень хорошо, не так ли? – Lauriane

+0

Да, использование конструктора DI требует некоторой адаптации в коде. Вам просто нужно скорее передать необходимые классы через конструктор, а затем использовать объекты Global. @ bruce-lowe ниже показывает хорошее понимание этого подхода. – liosedhel

1

Вы не можете использовать Api.user («email»), поскольку Api - это класс, а не объект. В java это похоже на вызов нестатического метода из статического метода. Теоретически у вас может быть более одного экземпляра Api, или даже нет экземпляров Api. Поэтому нет смысла использовать класс Api в объекте FlashSession.

Если изменить флэш в классе и впрыснуть класс Api он будет работать лучше:

class FlashSession @Inject()(api: Api) { 
    def test = ... api.user("[email protected]") .... 
} 

Затем вам нужно будет вводить FlashSession во все классы, которые используют его.

Вы можете обнаружить, что новые разработчики сделают все, что угодно, с самого легкого, и не делают DI (инъекции зависимостей). Чтобы обеспечить более эффективное тестирование с помощью таких вещей, как mocks, они развиваются в использование DI. Однако классы смешивания и сопоставления с DI и объектами не работают.

+0

Я задал этот вопрос, чтобы узнать, есть ли «красивый» код для достижения желаемого. Видимо, нет ... Поэтому я, вероятно, забуду об этом и сделаю это по-другому, что не создаст такой беспорядок. Но спасибо за ваш ответ! – Lauriane