2010-09-14 7 views
3

Je les classes suivantes:Créer des instances d'une classe qui a besoin d'un argument constructeur avec StructureMap

public class AllowanceManager : IAllowanceManager 
{ 
    public AllowanceManager(ITranslationManager t_Manager, ISessionManager s_Manager) 
    {...} 
} 

public class TranslationManager : ITranslationManager 
{ 
    public TranslationManager(string culture) 
    {...} 
} 

public class SessionManager : ISessionManager 
{ 
    public SessionManager(string key) 
    {...} 
} 

Comment puis-je initialiser ce cours en ObjectFactory afin que l'obtention d'une instance de IAllowanceManager aussi autowires et Initialise (avec les arguments du constructeur) StateManager et TranslationManager. Alors que j'ai seulement besoin de récupérer l'instance de IAllowanceDeduction comme suit:

IAllowanceManager a_Manager = ObjectFactory....// Gets Allowancemanager configured with initialized instances of IStateManager and ITranslationManager 

Répondre

1

Modifier: Encore plus court.

Mettre dans votre code bootstrapper:

ForRequestedType<IAllowanceManager>().TheDefault.Is 
     .ConstructedBy(() => new Allowancemanager(new StateManager(), new TranslationManager())); 
+0

arg1 et arg2 ici étant des cas de ITranslationManager et ISessionHelper respectivement? –

+0

oui, vérifiez mon edit –

+0

Veuillez expliquer comment StateManager et TranslationManager sont construits car je ne peux pas vous voir passer les arguments "culture" et "clé" requis. –

1

En utilisant 2.6.1 syntaxe il pourrait être écrit:

For<ISessionManager>().Use<SessionManager>() 
    .Ctor<string>("key").Is(c => GetSessionKey()); 
For<ITranslationManager>().Use<TranslationManager>() 
    .Ctor<string>("culture").Is(c => Thread.CurrentThread.CurrentCulture.Name); 
For<IAllowanceManager>.Use<AllowanceManager>(); 

où retourne GetSessionKey votre clé de session d'une manière similaire à la façon dont la culture est résolu.

Voir ce blog entry pour une description plus détaillée de la façon de résoudre les arguments contructor.

+0

Ces types sont enregistrés dans une classe de registre qui n'est pas dans une portée pour récupérer les arguments clé et culutre. Ces arguments sont disponibles lorsque les instances sont récupérées. –

+0

@Waliaula d'où viennent la clé de session et la culture? Quel objet a accès à ces valeurs? – PHeiberg

+0

Les viennent d'un accès querystring sur une page. Maintenant, pourquoi votre solution ne fonctionnera pas est que le mappage est effectué dans une classe de registre qui est ensuite ajoutée à Objectfactory dans le fichier global.asax. Cela signifie que je n'ai pas accès au mappage "clé" et "culture" lors de l'installation, mais je les ai lors de la récupération des instances au moment de l'exécution. Vérifiez ma réponse ci-dessous. –

0

Je suis venu avec la solution suivante:

IStateManager stateManager = ObjectFactory 
    .With<string>("key") 
    .GetInstance<IStateManager>(); 

ITranslationManager translationManager = ObjectFactory 
    .With<string>("culture") 
    .GetInstance<ITranslationManager>(); 

manager = ObjectFactory 
    .With<ITranslationManager>(translationManager) 
    .With<IStateManager>(stateManager) 
    .GetInstance<IAllowanceDeductionManager>(); 
Questions connexes