Comment configurer Ninject pour qu’il injecte la bonne instance en fonction de l’instance précédemment injectée

Je ne trouve pas les mots justes pour ma question, je laisse donc mon code parler à la place.

J’ai un repository:

class Repository { public Repository(DbContext ctx) { } } 

alors j’ai cette liaison:

 Bind().To(); Bind().To().When... Bind().To().When... 

et puis j’ai classe qui doit accéder à la fois à la firebase database

 class Foo { public Repository(IRepository userRepo, [CentralStoreAtsortingbute]IRepository centralRepo) { } } 

Comment dois-je configurer deux liaisons DbContext pour que les référentiels avec les contextes DbContext (basés sur CentralStoreAtsortingbute) soient injectés dans le constructeur Foo?

Plutôt que de compter sur des atsortingbuts aux bons endroits, je crée généralement plusieurs types qui ne sont en réalité que des alias. C’est utile car avec Ninject (et probablement d’autres conteneurs IoC), nous demandons des dépendances par leur nom de type.

Donc, si vous avez besoin de pouvoir “demander” un référentiel d’utilisateur par rapport à un référentiel central, je créerais des types qui l’aliasent comme ceci:

 interface IRepository { /* methods and properties */ } interface IUserRepository : IRepository {} interface ICentralRepository : IRepository {} class Foo { public Foo(IUserRepository userRepo, ICentralRepository centralRepo) { // assign to fields } } 

Je préfère cela parce qu’alors Ninject ne saigne pas du tout dans mon application, il est plus déclaratif et je pense que c’est plus simple à retenir que toute approche basée sur des atsortingbuts basée sur des conventions comme celle que vous essayez.

J’ai essayé cela dans une preuve de concept, mais je suis finalement allé dans une direction différente.

 Bind().ToMethod(x => { var repositoryType = x.Kernel .Get() .SomeSsortingngPropertyDenotingTheRepository; switch (repositoryType ) { case "1": return (IRepository)new Repository1(); default: return (IRepository)new Repository2(); } }).InRequestScope(); 

Bien que cela ait fonctionné, je n’ai jamais compris s’il utilisait mon instance singleton d’IObjectB ou instanciait une nouvelle instance – cela devrait être assez facile à comprendre. J’ai pensé qu’il appelait ToMethod chaque fois que j’utilisais DI sur IRepository – encore une fois, aucune vérification.

Utilisez la surcharge When(Func condition) pour vérifier de manière récursive si r.Target.IsDefined(typeof(TAtsortingbute), false) est vrai pour la demande donnée ou pour l’un de ses anchestreurs r.ParentRequest

 Bind().To(); Bind().To() .When( context => context.Target != null && context.Target.GetCustomAtsortingbutes( typeof( CentralStoreAtsortingbute ) ) != null ); // make the general binding after the more specific one Bind().To();