2010-07-30 15 views
2

Je cherchais depuis longtemps.Injection de dépendances avec Ninject 2.0 pour C# ASP.NET (PAS MVC)

Je ne suis pas nouveau à l'injection de dépendance et j'ai utilisé StructureMap avec plusieurs projets MVC et autres, mais j'ai eu envie de donner un coup de Ninject, pour ne pas rater le plaisir.

J'essaie d'utiliser Ninject avec une application Web existante que je mets à jour.

Je ne pouvais pas trouver sur les blogs et le wiki fournis par Ninject, je suis un peu impatient d'être honnête alors peut-être l'ai manqué, et les premières pages de google semblent être obsolètes ou parler de l'utilisation de MVC avec Ninject. Jusqu'à présent, j'ai ce qui suit et cela fonctionne, mais j'espérais que quelqu'un pourrait signaler une option moins intrusive, concernant l'appel du ServiceModule au noyau et l'injection d'une propriété avec la liaison souhaitée de l'application Web.

Ce que j'ai à ce jour est un ServiceModule:

public class ServiceModule : NinjectModule 
{ 
    public override void Load() 
    { 
     string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
     Bind<IPreRegistrationService>().To<PreRegistrationService>() 
      .WithConstructorArgument("connectionString",connectionString); 
    } 
} 

Puis dans ma page, j'ai défini une variable privée:

private IPreRegistrationService xfemPreRegistrationService = null; 

Ensuite, en cas de chargement de la page:

IKernel kernel = new StandardKernel(new ServiceModule()); 
    xfemPreRegistrationService = kernel.Get<IPreRegistrationService>(); 

Donc, cela fonctionne, mais ce que je voudrais, c'est de passer à une phase où tout ce que je définis est:

[Inject] 
public IPreRegistrationService xfemPreRegistrationService { get; set; } 

sur une page et le reste est magique.

Vive

Répondre

2

Merci à this stackoverflow post j'ai découvert l'extension Ninject.Web

problème que j'ai trouvé que vous devez commencer à l'aide Ninject.Web et je ne pouvais pas comme je l'ai déjà PageBase défini pour gérer les titres et le tel. Alors

, la seule façon que je pouvais voir était de prendre le KernelContainer class du projet (comme KernelContainer est défini comme interne):

appellent ensuite de la asax mondiale OnApplicationStart:

KernelContainer.Kernel = new StandardKernel(new ServiceModule()); 

// Request injections for the application itself. 
KernelContainer.Inject(this); 

Puis, en mon PageBase de la méthode OnInit:

KernelContainer.Inject(this); 

Cela m'a permis d'atteindre mon objectif de mettre simplement:

[Inject] 
public IPreRegistrationService xfemPreRegistrationService { get; set; } 

où nécessaire