Ninject - quand et comment injecter
Je suis un newbie quand il s'agit de DI et ninject et je suis un peu en difficulté
lorsque l'injection doit se produire et comment commencer la
de liaison.
Je l'utilise déjà dans mon application web et il fonctionne très bien il y,
mais maintenant je veux utiliser l'injection dans une bibliothèque de classe.
Dire que j'ai une classe comme ceci:
public class TestClass
{
[Inject]
public IRoleRepository RoleRepository { get; set; }
[Inject]
public ISiteRepository SiteRepository { get; set; }
[Inject]
public IUserRepository UserRepository { get; set; }
private readonly string _fileName;
public TestClass(string fileName)
{
_fileName = fileName;
}
public void ImportData()
{
var user = UserRepository.GetByUserName("myname");
var role = RoleRepository.GetByRoleName("myname");
var site = SiteRepository.GetByID(15);
//Use file etc
}
}
Je veux utiliser la propriété d'injection ici parce que j'ai besoin de passer dans un
nom de fichier dans mon constructeur. Ai-je raison de dire que si j'ai besoin de
passer un paramètre dans le constructeur, je ne peux pas utiliser le constructeur de l'injection?
Si je peux utiliser du constructeur d'injection avec d'autres paramètres, comment faire
Je passe ces paramètres?
J'ai une application console qui consomme par classe de Test qui a l'air
suit:
class Program
{
static void Main(string[] args)
{
//NinjectRepositoryModule Binds my IRoleRepository etc to concrete
//types and works fine as I'm using it in my web app without any
//problems
IKernel kernel = new StandardKernel(new NinjectRepositoryModule());
var test = new TestClass("filename");
test.ImportData();
}
}
Mon problème est que lorsque j'appelle test.ImportData()
mes dépôts sont nulles et rien n'a été injecté dans les. J'ai essayé de créer un autre module et de l'appel de
Bind<TestClass>().ToSelf();
que j'ai pensé que cela pourrait résoudre tous injection propriétés dans TestClass
mais je suis nulle part.
Je suis sûr que c'est un problème trivial, mais je n'arrive pas à les trouver
comment aller à ce sujet.
Vous devez vous connecter pour publier un commentaire.
Vous êtes directement newing
TestClass
, qui Ninject n'a aucun moyen de l'interception de - rappelez-vous il n'y a pas de magie comme le code de la transformation de l'interception de votrenew
s etc.Que vous devriez faire
kernel.Get<TestClass>
à la place.A défaut, vous pouvez injecter après vous
new
avec unkernel.Inject( test);
Je pense qu'il y a un article dans le wiki qui parle de
Inject
vsGet
etc.Remarque qu'en général, direct
Get
ouInject
les appels sont un Fais Mal l'odeur de l'Emplacement du Service, qui est un antipattern. Dans le cas de votre application web, leNinjectHttpModule
etPageBase
sont le crochet qui intercepte la création de l'objet - là sont semblables intercepteurs /logique des endroits à intercepter les autres styles de l'application.Re votre
Bind<TestClass>().ToSelf()
, généralement unStandardKernel
aImplicitSelfBinding = true
qui le rendrait inutile (sauf si vous voulez influencer son Champ d'application à être autre chose que.InTransientScope()
).Un dernier point de style:- vous êtes en utilisant la propriété d'injection. Il y a rarement de bonnes raisons pour cela, donc vous devriez être en utilisant le constructeur de l'injection à la place.
Et faire aller l'acheter L'Injection de dépendance dans la .NET par @Mark Seemann, qui a des piles de super posts ici qui couvrent beaucoup de choses importantes, mais de subtiles considérations dans et autour de la Dépendance de la zone d'Injection.
Main
dire la duplication de Ciaran, en réponse à côté de qui? Vous dites que je devrais avoir honte de ne pas avoir inclus les trucs en OPs réponse?OK,
J'ai trouvé comment faire ce dont j'ai besoin, en partie grâce à vos commentaires Ruben. J'ai créé un nouveau module que, fondamentalement, est titulaire de la configuration que j'utilise dans la bibliothèque de classe. Dans ce module, je peux soit Lier à l'aide d'un espace réservé à l'Interface ou je peux ajouter un paramètre dans le constructeur de la CustomerLoader.
Ci-dessous le code à partir d'un mannequin console application de démontrer de deux façons.
Cela peut aider quelqu'un d'autre a commencé avec des Ninject!