2011-10-14 6 views
0

J'ai un projet appelé MyProjectReport (assembly). Dans ce projet, j'ai une classe appelée MyMainReport. Dans cette classe (j'utilise le pattern repsoitoire dans un assemblage), j'ai deux Interfaces. Une interface s'appelle IReportRepository1 et IReportRepository2. Dans MyMainReport, mon constructeur est le suivant:Ninject Dans un assemblage

public MyMainReport(IReportRepository1 reportRepository1 , IReportRepository1 reportRepository2) 
    { 
     this.reportRepository1 = reportRepository1 ; 
     this.reportRepository2 = reportRepository2 ; 
    } 

. J'ai NinjectModule comme suit:

public class DINinjectServiceModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IReportRepository1 >() 
      .To<ReportRepository>(); 
     Bind<IReportRepository2 >() 
       .To<ReportRepository2>(); 

    } 

} 

. Normalement, l'applcation initialise le noyau dans l'asax global. Un exemple d'un dans un WCF webService serait la suivante:

public class Global : NinjectWcfApplication 
{ 

    protected override IKernel CreateKernel() 
    { 
     return new StandardKernel(new DINinjectServiceModule()); 
    } 

} 

De cette façon, mes dépôts seraient chargés automatiquement. Cependant, comme j'ai un assemblage, je n'ai pas de fichier Global.asax. J'ai créé une classe appelée sélecteur de rapport. J'utilise le motif décorateur pour charger dynamiquement mes rapports.

public class ReportSelector : IReportBuilder 
{ 
    IReportBuilder buildareport; 

    public ReportSelector(IReportBuilder buildareport) 
    {    
     this.buildareport = buildareport;    
    } 

    public void CreateDocument() 
    { 
     buildareport.CreateDocument(); 
    } 
} 

Voici comment j'appellerais normalement le générateur de rapports sans utiliser de constructeur IOC.

IReportBuilder buildrep = new ReportSelector(new MyMainReport.ReportBuilder.MyMainReport()); 
     BuildReport(buildrep); 

Cependant, il me cherche de passer dans mes interfaces de référentiel. Il ne les charge pas dynamiquement. Comment puis-je configurer cela. pour moi, l'appel décorateur ci-dessus serait similaire à mon application_start dans mon fichier Global.asax. Comment procéder pour charger mes référentiels dans un assemblage/projet?

Merci Remo Gloor! Je pensais avoir besoin d'une usine comme celle du contrôleur dans MVC. Cependant, je ne suis pas sûr de savoir comment je devrais y aller. La plupart des exemples ont une extension ou utilisent une classe de base comme le contrôleur. J'écris un service web qui va exécuter un traitement par lots. Utiliser un service Web n'est pas mon choix pour ce processus, même si je sais que certaines personnes aiment utiliser les services Web pour cela. J'ai un assemblage qui crée des PDF dynamiques, et enverra par courriel ces PDF. Je voudrais utiliser le module Ninject pour charger mes dépôts comme vous le feriez dans un projet MVC. Je ne suis pas sûr de savoir comment accomplir cela dans un assemblage autonome. Actuellement, j'ai le reportselector comme indiqué ci-dessus, ce serait comme la racine de démarrage de n'importe quelle application. J'ai une méthode dans mon service Web appelé BuildAllReports que toute application peut appeler pour consommer le service. Ainsi, lorsque BuildAllReports est appelé, le traitement par lots s'exécute. Pouvez-vous me donner un exemple d'utilisation de Ninject dans un assemblage comme mentionné? Merci

+1

Est-ce java? Si c'est le cas, vous obtiendrez de meilleurs résultats en remplaçant la balise ** assembly ** par ** java **. – karlphillip

Répondre

1

La bonne façon d'utiliser un conteneur IoC est de configurer le noyau et de résoudre tout le nécessaire pour exécuter l'application dans la racine de l'application.

Vous avez déjà montré le bon chemin pour les projets Web et Wcf. Dans le cas des exécutables, la racine de l'application est la méthode principale du programme.

Puisque vous n'avez pas indiqué le type d'application que vous écrivez, je ne peux pas vous dire lequel s'applique à vous.

Pour tout ce qui peut être résolu au démarrage de l'application, vous devez créer une interface usine dans votre implémentation pour obtenir ces instances. L'implémentation de cette interface fait partie de votre configuration cointainer dans la racine de l'application. De telles usines sont le seul endroit où vous devriez accéder au noyau.

Questions connexes