2010-05-28 20 views
2

Je commence avec Dependency Injection et j'ai quelques problèmes pour injecter une dépendance dans une classe de base.Injecter une dépendance dans une classe de base

J'ai un contrôleur BaseController dont mes autres contrôleurs héritent. À l'intérieur de ce contrôleur de base, je vérifie si l'utilisateur a les droits nécessaires pour voir la page en cours, vérifier l'existence de certaines variables de session, etc.

J'ai une dépendance à l'intérieur de ce contrôleur de base que je voudrais injecter à l'aide Ninject mais quand je le mettre en place comme je le ferais pour mes autres dépendances on me dit par le compilateur que:

erreur 1 « MyProject.Controllers.BaseController » ne contient pas Un constructeur que prend 0 argument

Cela a du sens, mais je ne suis pas sûr de savoir comment injecter cette dépendance. Devrais-je utiliser ce modèle d'utilisation d'un contrôleur de base ou devrais-je le faire d'une manière plus efficace/correcte?

+0

pouvez-vous poster du code de constructeurs BaseController? –

+4

Au lieu de résoudre ce problème, considérez ces règles: 1) Favoriser la composition sur l'héritage. 2) N'effectuez aucun travail dans les constructeurs. Suivre les deux vous facilitera la vie avec DI. –

Répondre

11

votre constructeur de BaseController devrait être comme ça

BacseConctoller(Info info) 
{ 
    this.info = info 
} 

puis pour toutes les classes de inheritence leur constructeur

ChildController(Info info):base(info) 
{ 
} 

dans ce cas, vous pouvez injecter objet Info à la classe de contrôleur de base

+1

M. Seemann! J'ai récemment lu [votre livre] (http://www.amazon.com/Dependency-Injection-NET-Mark-Seemann/dp/1935182501) :) – Bart

1

Mark est juste sur l'argent,

BaseClass(dependantObject object) 
{ 
Object = object; 
} 

Ainsi, pour satisfaire le dependantObject afin que toutes les sous-classes puissent accéder au comportement de base, nous pouvons utiliser l'injection sur la sous-classe et simplement chaîner le constructeur de base, en passant dans notre objet 'Ninjected'.

SubClass() : this(null) {} 

SubClass(dependantObject object) : base(object) 
    { 

    } 

codage heureux!