2011-09-26 3 views
3

J'ai une hiérarchie de classes comme celui-ci (simplifié):Ninject liaison Constraint qui recherche jusqu'à trouver un type

class Connection 
{ 
} 

interface IService<T> 
{ 
} 


class ServiceImplementation : IService<int> 
{ 
    public ServiceImplementation(Connection) 
    { 
    } 
} 

interface IConnectionConfiguration 
{ 
    public void Configure(Connection c) 
} 

class ConnectionConfiguration : IConnectionConfiguration 
{ 
    public void Configure(Connection c) 
} 

Là où j'ai plusieurs implémentations de IConnectionConfiguration et IService. Je veux créer un fournisseur/liaisons qui:

  1. construit une nouvelle instance de connexion. GetAll et applique cela à la connexion
  2. Manchettes spécifient que les implémentations IConnectionConfiguration à utiliser, sur la base du type de IService à construire

Actuellement, j'ai une implémentation du fournisseur comme ceci:

public Connection CreateInstance(IContext context) 
{ 
    var configurations = context.Kernel.GetAll<IConnectionConfiguration>() 
    var connection = new Connection(); 
    foreach(var config in configurations) 
    { 
     config.Configure(connection); 
    } 

    return connection; 
} 

Mais lorsque je tente de rendre la liaison contextuelle pour IConnectionConfiguration il n'a pas une demande parente ou un contexte parent ...

Bind<IConnectionConfiguration>().To<ConcreteConfiguration>().When(ctx => { 
// loop through parent contexts and see if the Service == typeof(IService<int>); 
// EXCEPT: The ParentRequest and ParentContext properties are null. 
}); 

Qu'est-ce que je fais mal ici? Puis-je faire ça avec ninject? En appelant le kernel.GetAll, vous créez une nouvelle demande.

Répondre

2

Il n'a aucune information sur le contexte de service. Il y a une extension qui vous permet de créer de nouvelles demandes qui préservent le contexte original (Ninject.Extensions.ContextPreservation)

Voir aussi https://github.com/ninject/ninject.extensions.contextpreservation/wiki

context.GetContextPreservingResolutionRoot().GetAll<IConnectionConfiguration>(); 
+0

merci, je préférerais ne pas avoir à ajouter une extension à la projet, est-il possible de créer "manuellement" une requête enfant en préservant le contexte? – icedtoast

+1

Pourquoi ne voulez-vous pas ajouter une extension? Ils font partie du projet Ninject. Et bien sûr, il y a un moyen de le faire manuellement. Faites exactement ce qui est fait dans l'extension. Mais de cette façon, vous devrez maintenir votre code vous-même. –

Questions connexes