2009-02-26 20 views
2

Je voudrais créer un OnePerSessionBehavior pour NInject (v1.0) et je l'ai surtout fait fonctionner. Le seul problème qui reste est de savoir comment passer de nouveaux arguments en utilisant .WithArguments() car chaque nouvelle session demande quelque chose au conteneur. À l'heure actuelle, je garde une référence au conteneur en tant que variable d'application et par conséquent, le module n'est chargé qu'une seule fois, alors bien sûr, la liaison ne se produit qu'une seule fois. Par exemple, ce qui suit renvoie des instances individuelles de 'Quelque chose' pour chaque nouvelle session, mais l'argument constructeur transmis à toutes les sessions est le même DateTime.Implémentation de OnePerSessionBehavior dans NInject

Bind<ISomething>() 
    .To<Something>() 
    .Using<OnePerSessionBehavior>() 
    .WithArgument("currentDateTime", DateTime.Now); 
+0

Je suppose que vous avez besoin de quelque chose de plus que juste DateTime.Now. Pouvez-vous exposer vos besoins un peu plus s'il vous plaît? :) –

Répondre

0

Vous transmettez une valeur qui a été évaluée lors de la définition de la liaison. C'est pourquoi vous obtenez la même valeur encore et encore. En fait, je n'ai pas de réponse facile à cette question, mais je vais certainement y réfléchir, car cela pourrait être utile à des fins de test pour moi.

1

Pouvez-vous passer un lamda comme argument? Par exemple, si vous avez une classe comme ceci:

public class Something : ISomething 
{ 
    public Something(Action<DateTime> initializer) 
    { 
     var now = initializer(); 
    } 
} 

Vous pouvez lier comme suit:

Bind<ISomething>() 
    .To<Something>() 
    .Using<OnePerSessionBehavior>() 
    .WithArgument("initializer",() => { return DateTime.Now; }); 

Bien que je ne vous connais pas la situation exacte, une autre idée serait de créer votre objet sans se soucier de l'injection d'arguments, et puis définir vos propriétés:

kernel.Bind<ISomething>().To<Something>().Using<OnePerSessionBehavior>();  
var mySomething = kernel.Get<Something>(); 
mySomething.DateCreated = DateTime.Now; 

ou:

mySomething.Initialize(DateTime.Now); 

L'une ou l'autre de ces idées fonctionnerait-elle?