Remplacer usine de création de l'objet avec le CDI mécanisme

J'ai voulu introduire CDI (Soudure) à notre projet, et maintenant un peu de mal avec les objets qui sont construits manuellement.

Donc nous avons quelques classes de mise en œuvre de la IReport interface, qui ont un champ qui doit être injecté. C'est null lors de l'exécution, parce que toutes ces classes sont générées par le ReportFactory dans une classe ReportController.

private Map<String,Object> generateReport(ReportInfo ri, ...) {
//some input validation
    IReport report = ReportControllerFactory.getReportInstance( ri.getClassName() );
//...
}

Je suis conscient que je peux utiliser le @Produces annotation avec un autre annotations personnalisées dans le ReportControllerFactory, mais comment puis-je utiliser le @Inject pour une variable qui ne peut être créé, après la validation de certains a fait, à l'intérieur de une méthode? Et comment dois-je présenter le paramètre ri.getClassName()? L'objet ri n'est pas connue au moment de l' ReportController est construit.

Merci beaucoup!

Salutations,
Sebastian

Modifier à Jul 08, 2011 (10:00):

ReportFactory classe:

public static IReport getReportInstance( String className ) throws ReportException {

    IReport report = null;

    try {
        Class<?> clazz = Class.forName( className );
        report = (IReport) clazz.newInstance();
    }
    catch ( Exception e ) {  }        

    return report;
}

Edit 2 (Sélection du rapport de mise en œuvre)

L'instance de rapport est sélectionné par certains chemins qui vont de la JSF frontal pour le ReportController. Le ManagedBean appelle un bean de session, qui a plusieurs méthodes, selon sur quel bouton a été pressé où. Toutes ces méthodes de définir le rapport nom et l'appeler le plus générique de la méthode sendOrGetReport. Cette méthode permet de sélectionner la clé unique pour le rapport spécifié à partir de la base de données et décide de envoyer un e-mail ou livrer immédiatement le rapport. Imaginons qu'il doit être livré.

Puis le ReportController entre en jeu. Il va chercher un ReportInfo objet basé sur la clé unique et d'autres informations fournies par les méthodes ci-dessus et appelle la ReportFactory pour créer un rapport de type ri.getClassName().

De fantaisie, hein? Je pense que l'ensemble de cette section pourraient avoir besoin d'un refactoring. Si vous ne voyez pas facile spot, j'ignore l' @Inject dans le rapport de mise en œuvre et de faire un JDNI de recherche pour cette ressource.

Êtes-vous essayer d'injecter "rapport" (ce qui semble étrange, car comme vous l'avez souligné, il ne peut être construit à l'exécution) ? Ou peut-être ce dont vous avez besoin serait d'injecter une usine (avec injection de dépendances) au lieu d'utiliser une méthode statique ?
Oui, le "rapport" a un champ qui a une annotation @Inject. Donc j'ai en quelque sorte de dire CDI à résoudre que par injection. J'ai édité ma question et ajouté le code d'usine.
Ok, mais dans ce cas, puisque vous êtes à l'aide de clazz.newInstance() pour créer le IReport bean, il ne peut pas se injectés de dépendance droit ? Je ne sais pas votre DI-cadre, mais vous avez probablement d'utiliser une sorte de "injecteur" / "beanRepository" / "beanFactory" dans le cadre afin de créer les haricots avec la dépendance de l'injection, n'est-ce pas ?
Pouvez-vous mettre à jour votre question avec un peu plus explicite des informations sur les critères dont vous avez besoin pour décider qui IReport de mise en œuvre vous avez besoin au moment de l'exécution?
Merci, je l'ai fait. Assez compliqué, mais ça pourrait aider.

OriginalL'auteur Sebastian Wramba | 2011-07-08