1

J'ai une classe MessageSender que son constructeur ressemble à ceci:Unity 2.0: Comment créer des conteneurs enfants sur CTor injection?

public MessageSender(IInputComponent input, IOutputComponent output) 
    { 
     m_Input = input; 
     m_Output = output; 
    } 

Voilà comment j'instancier:

Container.RegisterType<IMessageSender, MessageSender>(); 
    Container.RegisterType<IInputComponent, KeyboardInput>(); 
    Container.RegisterType<IOutputComponent, ScreenOutput>(); 
    Container.RegisterType<ILogger, Logger>(); 
    return Container.Resolve<IMessageSender>(); 

Voici le consutructor KeyboardInput:

public KeyboardInput(IUnityContainer container) 
    { 
     m_Container = container; 
     m_Logger = container.Resolve<ILogger>(); 
    } 

Je veux l'instance KeyboardInput pour recevoir un conteneur enfant à son constructeur, de sorte qu'il résoudra son enregistreur à partir du conteneur enfant et non du parent.

Comment puis-je accomplir cela?

Merci!

Répondre

3

Vous n'êtes pas censé prendre une dépendance sur IUnityContainer dans KeyboardInput ou toute autre classe. Un conteneur DI doit résoudre tous les composants et se mettre à l'écart - c'est ce que j'appelle le Hollywood Principle for DI. Garder une référence sur le conteneur mène vers le Abstract Service Locator anti-pattern, donc c'est une très mauvaise idée.

Ces messages récents par Krzysztof Kozmic explique assez bien:

Il est toujours possible de repenser le modèle d'objet afin que le référencement du conteneur est pas nécessaire. Pourquoi pensez-vous que vous avez besoin du conteneur dans KeyboardInput?

+0

Merci pour la réponse! La raison principale pour laquelle j'aimerais disposer du conteneur IOC en tant que variable d'instance est que je voudrais instancier les proxys de service, jetables, en tant que variables locales dans les méthodes, afin que je puisse appeler la méthode Dispose() Dès que possible. –

+0

Cette réponse pourrait aider avec ça: http://stackoverflow.com/questions/3010820/dependency-injection-wcf/3011473#3011473 –