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
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. ? –
comme classe abstraite 1) A: Interface; B: A; C: A, D [Attribut]: A; 2) E: Interface; E1: E; 3) Iaa: Interface; R: Iaa –
jetez un oeil à '.WhenInjectedInto()' et '.WhenInjectedExactlyInto()' ou '.WhenAnyAncestorNamed()'. sinon veuillez mettre à jour la question avec plus de détails. –