2010-10-21 5 views
1

J'essaie d'utiliser Ninject pour injecter un XmlReader. Le problème est qu'il est créé par une méthode d'usine insted d'un constructeur. Et je ne peux pas ajouter un [Inject] au code dans le .NET Framework. Maintenant, j'utiliser pour créer après la liaison XmlReader:Utiliser la méthode usine dans Ninject que je ne peux pas ajouter d'attribut à

Bind<IXmlReader>() 
    .ToMethod(
     x => 
     XmlReader.Create(
         (string) GetParameter(x, "inputUri"), 
         (XmlReaderSettings) GetParameter(x, "settings"))) 
    .Named("definition");    


private object GetParameter(IContext context, string name) 
{ 
    var parameters = (List<IParameter>) context.Parameters; 
    return (from p in parameters 
      where p.Name == name 
      select p.GetValue(context)) 
      .FirstOrDefault(); 
} 

Et je l'utilise comme suit:

var reader = _kernel.Get<IXmlReader>("definition", 
            new Parameter("inputUri", FilePath, false), 
            new Parameter("settings", settings, false))) 

Mais ce code est horrible. Puis-je le réécrire de façon plus élégante?

+0

Voir aussi http://stackoverflow.com/questions/10141661/ninject-cascading-constructor-arguments/10142063#10142063 –

Répondre

1

Vous ne faites pas DI, vous êtes en train de faire le service.

Je ne sais pas votre contexte réel mais je pense que je serais dépendons d'un Func<string,string,IXmlReader> et faire le Bind comme suit: -

Bind<Func<string,string,IXmlReader>>() 
    .ToMethod((inputUri,settings) => XmlReader.Create(inputUri,settings)) 
    .Named("definition"); 

Ensuite, vous déclarerons l'article injecté dans votre args constructeur:

[Named("definition")]Func<string,string,IXmlReader> createReader 

Le bit amusant est que [Named] ci-dessus est mon propre attribut upy makey et vous devez faire l'aspect conditionnel au moment de la liaison. Jetez un oeil sur le dojo, il vous montrera comment faire ce peu. Il ya un NamedAttribute intégré (et a été pendant des siècles, je ne sais pas ce que je pensais).

Si quelque chose comme l'injection d'une usine est utile dans votre cas, la prochaine chose à regarder est Ninject.Extensions.Factory. Il gère la plupart de ces types d'exigences d'usine d'une manière propre.

Questions connexes