-1

d'abord pour les types inférences types qui ont l'attributPouvons-nous combiner deux fixations avec des conditions différentes?

var _kernel1 = new StandardKernel(); 

deuxième - qui pas marqué avec l'attribut

var_kernel2 = new StandardKernel(); 

Il devrait être, si nous ne pouvons pas résoudre le type dans la première kernel1, résolution dans le second noyau2

Liaisons:

_kernel1.Bind(a => 
    { 
     a.FromThisAssembly() 
    .SelectAllClasses() 
    .InheritedFrom<IStepContext>().WithAttribute<MarkAttribute>(x => x.Type == Inheritance.Derived) 
    .BindSelection(
      (t, baseTypes) => baseTypes.Where(bt => bt.IsInterface || bt == t.BaseType)); 
    }); 

    _kernel2.Bind(a => 
    { 
     a.FromThisAssembly() 
     .SelectAllClasses().BindAllInterfaces(); 
    }); 

Exemple: (et ce genre de classes peuvent être beaucoup)

public interface IStepContext 
{ 
    Type WhoIAm(); 
} 

public interface IStepContextAB : IStepContextSecond { } 

public interface IStepContextSecond : IStepContext { } 

abstract class A : IStepContext { } 

class B : A { } 

class B1 : A { } 

[markAttribute] 
class B2 : A { } 

class C : IStepContextAB { } 

class C1 : IStepContextAB { } 

[markAttribute] 
class C2 : IStepContextAB { } 

class D : IStepContext { } 

class D1 :D { } 

class D2 : D { } 

_kernel.Get<B>() ==> B2 
_kernel.Get<IStepContextAB>() ==> C2 
_kernel.Get<D>() ==> D 

Répondre

1

Il devrait être, si nous ne pouvons pas résoudre le type dans la première kernel1, résolution en second kernel2

Je crois en cette question ce que vous cherchez est le Ninject ChildKernel extension:

Cette extension Ninject permet de définir des noyaux enfants. Un noyau enfant est un noyau Ninject qui a un noyau parent. Toutes les requêtes qu'elle ne peut pas résoudre sont transmises au noyau parent.

cependant, il semble que vous essayez d'obtenir à conditional bindings est:

Bind<IWarrior>().To<Ninja>(); 
Bind<IWarrior>().To<Samurai>().WhenClassHas<ClimberNeeded>(); 
Bind<IWarrior>().To<Samurai>().WhenTargetHas<ClimberNeeded>(); 
Bind<IWarrior>().To<SpecialNinja>().WhenMemberHas<SwimmerNeeded>(); 
+0

il est de bonnes solutions si vous avez 3 classes comme: Ninja, Samurai et SpecialNinja. Mais que faire si vous avez beaucoup de types dont les héritages de IWarrior. ? –

+0

comme classe abstraite 1) A: Interface; B: A; C: A, D [Attribut]: A; 2) E: Interface; E1: E; 3) Iaa: Interface; R: Iaa –

+0

jetez un oeil à '.WhenInjectedInto()' et '.WhenInjectedExactlyInto()' ou '.WhenAnyAncestorNamed()'. sinon veuillez mettre à jour la question avec plus de détails. –