2009-04-09 4 views
0

Je n'arrive pas à trouver comment mettre StructureMap en cache une instance autre que celle par défaut. Je peux mettre en cache l'instance par défaut avec le code comme ceciUtilisation de StructureMap pour mettre en cache une instance nommée

ForRequestedType<ISession>() 
      .CacheBy(InstanceScope.HttpContext) 
      .TheDefault.Is.ConstructedBy(() => ObjectFactory.GetInstance<ISessionFactory>().OpenSession()); 

qui fonctionne comme prévu. Et je peux créer une instance nommée fin

InstanceOf<User>().Is.ConstructedBy(() => someAwesomeConstructor()).WithName("CurrentUser"); 

Mais je voudrais vraiment mettre en cache « CurrentUser » par session, mais .CacheBy() existe seulement dans CreatePluginFamilyExpression <> et la seule façon que je peux dire pour obtenir de CreatePluginFamilyExpression <> à IsExpression <> est par la propriété TheDefault, ce qui me force à créer un défaut, ce que je ne veux pas.

Répondre

1

Ajouter une ligne séparée avec:

ForRequestedType<User>().CacheBy(... 
InstanceOf<User>().Is.ConstructedBy(... 

Vous ne pouvez pas actuellement configuré la mise en cache des instances spécifiques. La même chose se produit si vous avez eu un IUser, et vous vouliez une mise en cache différente pour l'utilisateur que pour une autre classe, par exemple PerRequestUser. Dans ce cas, si vous demandez l'instance par IUser, la même mise en cache s'appliquera toujours.

C'est une limitation de courant de SM. Ce qui précède pourrait être ce dont vous avez besoin. Vous pouvez également envisager rouler vos propres lignes qui s'appeler à la place de cette expression:

() => someAwesomeConstructor() 

Au lieu de cela que vous appelez:

() => GetUserCachingInSession() 

Et dans cette méthode, vous avez une logique simple qu'il récupère de la session , si ce n'est pas le cas, enregistrez-en un nouveau dans la session.

+0

Dans ce cas, c'est parfaitement bien. J'ai seulement une instance "spéciale", donc avoir seulement une portée de cache n'est pas un problème. Je ne voulais tout simplement pas d'une instance par défaut car cela risquerait de dérouter quelqu'un s'il mettait un utilisateur dans un constructeur et faisait soudain sortir l'utilisateur actuel de nulle part. –

3

c'était aussi proche que je suis en mesure d'obtenir rapidement

ForRequestedType<IInterface>() 
    .AddInstances(x => x 
     .OfConcreteType<Implementation>() 
     .WithName("foo")) 
    .CacheBy(InstanceScope.HttpContext); 
+0

Si cela fonctionne, cela devrait être exactement ce que l'affiche a demandé, plus que simplement fermer! :) Signifierait également que Freddy a tort d'une limitation SM. Enfin, je pense qu'AddInstances est approuvé/recommandé? façon d'ajouter des instances nommées de sorte que c'est mieux que juste WithName comme Jeff a essayé – Schneider

Questions connexes