2010-03-08 4 views
1

J'ai un type de béton par défaut défini dans un registre:StructureMap utiliser différents types de béton par type d'objet

ForRequestedType<IXRepository>() 
     .TheDefaultIsConcreteType<CacheXRepository>(); 

Le ChaceXRepository a le constructeur suivant:

public class CacheXRepository: IXRepository {

public CacheXRepository(IXRepository xRepository,ICache cacheService){ 

Dans le constructeur, il reçoit un objet qui a le même type d'interface que lui-même, mais je souhaite passer dans un type concret différent.

Comment puis-je définir dans le registre que si le type est un CacheXRepository alors je veux que le type concret pour le paramètre IXRepository soit XRepository, dans tous les autres cas, IXRepository devrait se résoudre en CacheXRepository.

Répondre

2

Vous devriez jeter un oeil à la méthode enrichwith. Ensuite, le code ressemblera à quelque chose comme:

 ForRequestedType<IXRepository>().TheDefault.Is 
      .OfConcreteType<XRepository>() 
      .EnrichWith(
      (context, repository) => 
      new CacheXRepository(repository)); 

Regardez cette page pour plus d'informations: http://codebetter.com/blogs/jeremy.miller/archive/2008/01/27/interception-techniques-in-structuremap-2-5.aspx

+0

Merci! Le code je en fonction de votre réponse: ForRequestedType () .TheDefaultIsConcreteType () .EnrichWith ((dépôt) => nouvelle CacheXRepository (dépôt, ObjectFactory.GetInstance ())); – Devora

0

Que diriez-vous quelque chose comme (non Testet):

ForRequestedType<IXRepository>() 
    .TheDefaultIsConcreteType<CacheXRepository>() 
    .WithCtorArg("xREpository") 
    .EqualTo(new XRepository()); 

Je ne suis pas si familier avec cette Structuremap dialect :)

Dans la version que j'utilise ce serait:

For<IXRepository>() 
    .Use<CacheXRepository>() 
    .CtorDependency<IXRepository>("xRepository") 
    .IsConcreteType<XRepository>(); 
+0

Merci pour la réponse rapide, j'ai fini par utiliser une réponse différente, car il a utilisé la syntaxe dans ma version. Merci, j'apprécie votre aide! – Devora

+0

Pas de problème - vous devriez upvote sa réponse ainsi que de l'accepter :) – Luhmann

Questions connexes