À l'aide de Ninject, puis-je créer une instance à partir d'une interface sans exposer ma classe de béton?
Les échantillons que j'ai vu jusqu'à présent ressembler à ceci:
Écrire votre code comme celui-ci...
public class Samurai {
public IWeapon Weapon { get; private set; }
public Samurai(IWeapon weapon) {
Weapon = weapon;
}
}
Et Ninject pouvez mapper l'interface pour le béton de type comme ça...
public class WarriorModule : NinjectModule {
public override void Load() {
Bind<IWeapon>().To<Sword>();
}
}
Donc, quand je dis var samurai = kernel.Get<Samurai>();
dans mon Samurai objet de mon IWeapon est automatiquement une Épée.
C'est cool, mais si je veux juste le ISword sans le Samouraï et le béton épée est marqué comme interne?
Actuellement, j'utilise un home made solveur de dépendances où je pourrais dire var sword = DependencyResolver.Current.Resolve<ISword>();
et il me donne dos une Épée jeté comme ISword. Mes classes concrètes sont marqués comme interne, de sorte que le développeur doit passer par mon solveur de dépendances pour créer une instance. Ne Ninject ont quelque chose de semblable à cela?
Et une question bonus, je décore mes Interfaces avec un custom "DefaultConcreteType" attribut qui ma résolution de dépendances pouvez utiliser si aucune correspondance n'existe. Ne Ninject avoir quelque chose comme ça?
Grâce
OriginalL'auteur adam0101 | 2011-03-15
Vous devez vous connecter pour publier un commentaire.
Lorsque vous liez une interface à un type de béton, vous pouvez demander une instance de l'interface et d'obtenir le type de béton. Dans votre exemple, vous pourriez faire ceci:
Et ce serait vous donner un béton
Sword
objet. Vous pouvez faire beaucoup plus avec le système de liaison, trop. Vous pourriez mêmeBind<ISword>().ToMethod(MySwordFactory);
et écrire une méthode pour obtenir des Épées basé sur du demandeur contexte.Une autre chose que vous pouvez faire est de changer la façon de liaison des travaux basés sur le type, c'est d'être injecté dans. Par exemple, vous pouvez exposer une propriété sur une classe personnalisée:
Et puis, vous pouvez lier à un ISword mise en œuvre, basé sur la Maclasse:
Il y a beaucoup plus d'options, mais ce devrait vous donner une meilleure vue d'ensemble.
OriginalL'auteur
Je vous conseille d'utiliser un résumé de l'usine qui peut créer
ISword
s. Cela a un avantage surDependencyResolver
la nature, il peut créer sont bornées (àISword
).Votre abstract factory/s devra être public, tout comme votre DependencyResolver.
OriginalL'auteur
Cela ne veut pas répondre directement à votre question, mais je sais avec l'Unité, vous pouvez le faire en utilisant les fichiers de configuration plutôt que pour le câblage de vos dépendances dans le code. Ninject malheureusement n'a pas de support pour les fichiers de Config.
Votre alternative est d'utiliser la non-générique surcharges:
Et puis, vous devriez être en mesure de faire quelque chose comme:
mais c'est un gros moche si vous me demandez....
OriginalL'auteur