2010-05-14 7 views
1

Ai-je besoin de faire quelque chose de différent dans une classe abstraite pour que l'injection de dépendances fonctionne avec Ninject?Ninject: Classe abstraite

J'ai un contrôleur de base avec le code suivant:

public abstract class BaseController : Controller 
{ 
    public IAccountRepository AccountRepository 
    { 
     get; 
     set; 
    } 
} 

Mon Module ressemble à ceci:

public class WebDependencyModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IAccountRepository>().To<AccountRepository>(); 
    } 
} 

Et voici ma Global.asax:

protected override void OnApplicationStarted() 
{ 
    Kernel.Load(new WebDependencyModule()); 
} 

protected override IKernel CreateKernel() 
{ 
    return new StandardKernel(); 
} 

Il fonctionne quand Je décore la propriété IAccountRepository avec le [Inject] attribut.

+1

Edité répondre un peu - espérons que la chose globale est claire maintenant - n'hésitez pas à suivre dans les commentaires si cela n'a pas de sens. Assurez-vous de télécharger la source Ninject - c'est le meilleur endroit sur la planète pour obtenir des réponses sur Ninject. Les tests sont un assez bon ensemble de réponses. –

+0

Ah, c'est une bonne idée. Va vérifier le code source à coup sûr. Merci! – Pickels

Répondre

2

Vous ne savez pas exactement ce que vous essayez de faire.

On dirait que vous voulez faire l'injection de propriété. Si oui, vous devez coller sur l'attribut.

Ninject ne va pas aléatoirement coller des choses dans les propriétés.

Même si cela était possible, vous ne le voudriez pas du point de vue d'essayer de comprendre ce qui dépend de quoi (je me suis complètement sevré de PI).

Si vous voulez faire l'injection du constructeur, le contrôleur du béton devra en demander un et le transmettre à 'BaseController'.

Ninject va passer à Object et injecter des propriétés Attributed, mais ne traite pas les classes abstract d'une manière spéciale.

Soit ça ou il me manque quelque chose.

+0

ce genre de sens pour moi, comme vous ne préférez pas l'injection de propriété, avez-vous un échantillon de code? Il me semble que vous passeriez quelque part dans le IKernal, cette partie que je ne comprends pas complètement, pourriez-vous expliquer s'il vous plait? – Haroon

+0

@Haroon: Je ne peux pas penser à de bons exemples. Avez-vous regardé le [wiki de ninject] (https://github.com/ninject/ninject/wiki/Table-of-Contents)? Je dis que vous utilisez simplement l'injection de constructeurs partout. L'absence d'injection de propriété comme moyen rapide pour qu'une classe de base puisse injecter quelque chose ne peut être résolue que par: a) la suppression de l'emplacement du service (mauvaise); b) l'exécution de constructeurs dérivés l'exige en votre nom. N'importe quel endroit où la classe de base requiert le noyau n'est pas meilleur que l'emplacement du service - au moins Propety Injection vous donne un niveau d'indirection. –

+0

c'est ce que je pense, je n'aime pas le fait que je dois passer dans le kernal/conteneur et obtenir le ctor pour résoudre la dépendance. Passer trop d'informations à cette classe à mon goût. Le seul problème avec l'injection de propriété est que vous vous attachez à Ninject ... J'ai vu un exemple où je peux utiliser typeof de cette façon je ne référence pas ninject, seul mon attribut ... de toute façon tout cela me semble très hacky d'autant plus que j'utilise un conteneur IOC ... – Haroon

Questions connexes