2010-11-15 2 views
1

J'ai une configuration Ninject qui crée un résolveur JobContext InRequestScope() Cela fonctionne très bien, cependant, j'ai un appel très spécifique dans le site Web qui me demande de faire une boucle quelques bases de données (toutes les données dans les bases de données par année). Je ne pouvais pas vraiment comprendre ce qui se passait parce que j'avais oublié que le JobContext était InRequestScope mais le dernier bloc de code était pas agissant comme je le pensais.Avoir un InRequestScope et InTransientScope pour Ninject résolvant le même type

Voici la configuration

//Ninject module 
Bind<Data.IJobContext>().To<Data.JobContext>().InRequestScope(); 


//Controller's Initialize 
protected override void Initialize(System.Web.Routing.RequestContext requestContext) { 
    base.Initialize(requestContext); 

    //set a connection string for the jobContext 
    this.jobContext = DependencyResolver.Current.GetService<IJobContext>(); 
    jobContext.SetYear(currentYear); 
} 

Depuis JobContext est portée à la demande, il conserve réutilisant le même objet pour chaque année. C'est le seul cas où j'ai besoin que ce soit InTransientScope plutôt que .

//Special function 
foreach (int year in ActiveYears) { 
    jobContext = DependencyResolver.Current.GetService<IJobContext>(); 
    jobContext.SetYear(year); 
    DoSomething(); 
} 

Comment puis-je accomplir cela?

Répondre

3

Une question qui se pose est de savoir si vous avez vraiment besoin de la JobContext dans la portée de la requête parfois et dans d'autres cas dans la portée transitoire. Il semble y avoir une odeur de design! Essayez de résoudre ce problème avant de faire ce qui suit. Si vous voulez vraiment le faire comme vous l'avez décrit, vous devez spécifier deux liaisons nommées différentes, l'une en transitoire et l'autre en demande, et les obtenir par leur nom.

this.Bind<IJobContext>().To<JobContext>().InRequestScope().Named("RequestScoped"); 
this.Bind<IJobContext>().To<JobContext>().InTransientScope().Named("TransientScoped"); 
kernel.Get<IJobContext>("RequestScoped"); 

Juste une autre chose: je succest pour essayer de se débarrasser de l'utilisation ServiceLocator type du noyau Ninject et utiliser à la place l'injection de dépendance. Je vais avoir un meilleur design.

+0

Eh bien, sur presque toutes les pages, il est seulement nécessaire pour l'année en question. Sauf en un seul appel où j'ai besoin de lister tous les enregistrements dans chacune des bases de données. Je n'étais pas au courant de 'Named'. Bien que je n'aime pas ça, ça marche. J'ai essayé de trouver une autre façon de le faire, mais je suis à perte. :) – Buildstarted

+0

J'utilise l'injection de dépendances partout excepté cet emplacement, btw :) – Buildstarted

+0

Si vous utilisez InRequestScope et qu'une erreur de validation de Db se produit, vous ne pourrez pas l'enregistrer dans votre base de données avec un contexte de portée de requête. Dans ce cas, vous souhaitez qu'une portée transitoire enregistre cette exception spécifique dans votre base de données. Cet article donne beaucoup d'infos: http://stackoverflow.com/questions/26775080/how-to-handle-async-calls-with-ninject-inrequestscope – jsgoupil

Questions connexes