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:
- construit une nouvelle instance de connexion. GetAll et applique cela à la connexion
- 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.
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
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. –