10
votes

Utilisation de NInject, puis-je créer une instance à partir d'une interface sans exposer ma classe de béton?

Les échantillons que j'ai vus jusqu'à présent ressemblent à ceci:

Écrivez votre code comme celui-ci ... xxx

et ninject peut mapper l'interface sur le béton Tapez comme ceci ... xxx

alors quand je dis var samurai = kernel.get (); dans mon objet samouraï mon iweapon est automatiquement une épée.

C'est cool, mais si je veux juste que le nord isolaire sans le samouraï et l'épée de béton est marquée comme interne?

Actuellement, j'utilise une dépendance faite maison Résolveur où je pouvais dire var sword = dépendencyresolver.current.resolve (); et cela me donne une épée d'épée en tant que mot. Mes classes de béton sont marquées comme interne afin que le développeur doit passer par mon résolveur de dépendance pour créer une instance. Est-ce que Ninject a quelque chose de similaire à cela?

et une question de bonus, je décore mes interfaces avec un attribut personnalisé "DefaultConnetypeType" que mon résolveur de dépendance peut utiliser si aucun cartographie n'existe. NIJJEZ-t-il quelque chose comme ça?

merci


0 commentaires

3 Réponses :


0
votes

Je recommanderais d'utiliser une usine abstraite pouvant créer isword s. Cela a un avantage sur dépendencyResolver en ce que les types qu'il peut créer sont délimités (à être nord ).

Votre usine abstraite / ies devra être publique, tout comme votre dépendanceResolver.


0 commentaires

0
votes

Cela ne répond pas directement à votre question, mais je sais avec l'unité, vous pouvez le faire en utilisant les fichiers de configuration par opposition au câblage de vos dépendances en code. NInject n'a malheureusement pas de prise en charge des fichiers de configuration.

Votre alternative à cela, consiste à utiliser les surcharges non génériques: xxx

et puis vous devriez pouvoir être capable de Faites quelque chose comme: xxx

mais c'est un gros fugy si vous me demandez ...


0 commentaires

15
votes

Lorsque vous liez une interface à un type de béton, vous pouvez demander une instance de cette interface et obtenir le type de béton. Dans votre exemple, vous pouvez le faire:

Bind<ISword>().To<Sword>().WhenInjectedInto<MyClass>();


0 commentaires