2017-09-01 4 views
0

En application Lecture Scala 2.5, je définis mon contrôleur comme-Comment peut-on appeler des fonctions d'autres contrôleurs dans un contrôleur scala jeu

class Application @Inject() (ws:WSClient) extends Controller{ 

Maintenant, je veux appeler une fonction readConfig() d'un autre contrôleur classe- ConfigReader Y at-il un moyen de le faire, si je n'utilise pas de services pour cette utilisation particulière des cas de partage des fonctions dans les contrôleurs?

En jeu 2.4, avec les contrôleurs comme objets, je pourrais facilement le faire avec Appliation.readConfig(). Comment pouvons-nous faire cela avec les contrôleurs en tant que classes?

+4

Si vous vous trouvez vouloir appeler un autre contrôleur, vous pourriez vouloir remettre en question votre architecture: les contrôleurs ne sont pas supposés contenir de la logique. Il vaut peut-être mieux créer une classe supplémentaire (qui n'est pas un contrôleur) avec une logique partagée que vous pouvez utiliser dans les deux contrôleurs. Parmi les avantages sont: test, vous pouvez faire quelque chose avec le résultat (si vous appelez un contrôleur à partir d'un contrôleur, le résultat sera un 'Result') – rethab

+0

@rethab merci, – user189107

+0

@rethab, Maintenant, j'ai fait un séparé services pacakge avec une classe (DataOperations) contenant des fonctions qui doivent être partagées par les contrôleurs. Une fonction readConfig(), dans ce cas, aurait besoin de lire un fichier json en utilisant classLoader de play. Devrais-je utiliser DataOperations en tant que classe ou le déclarer en tant qu'objet? Étant donné que cette fonction nécessiterait que l'objet Environnement obtienne le contexte d'application actuel. Pourriez-vous me suggérer une méthode efficace pour savoir comment appeler les fonctions de DataOperations dans le contrôleur d'application? – user189107

Répondre

-1

Il suffit d'injecter l'instance du contrôleur:

Si vous avez:

class ConfigReader @Inject() (ws:WSClient) extends Controller { 
    def readConfig() = ??? 
} 

Vous devriez pouvoir l'injecter dans d'autres contrôleurs:

class Application @Inject() (ws:WSClient, configReader: controllers.ConfigReader) extends Controller { 
    def get() = Action { 
    configReader.readConfig() 
    } 
}