9
votes

T4MVC: impossible d'hériter d'une classe de contrôleur qui n'a pas de constructeur par défaut?

J'utilise T4MVC avec MVC2.

J'ai les blocs de construction suivants: P>

  1. Une interface d'entité simple qui définit que chaque entité POCO doit avoir un identifiant code> propriété: p>

    namespace MyApp.Web.Controllers {
        public partial class CDController {
            [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
            protected CDController(Dummy d) { }
    
  2. une simple classe de poco qui implémente l'interface code> Ientity code> et contient certaines propriétés de chaîne: p>

    public partial class CDController : EntityController<CD>
    {
        public CDController() : base(new CDManager()) { }
    }
    
  3. Un contrôleur de base: p>

    public abstract class EntityController<T> : Controller where T : class, global::IEntity
    {
        public EntityController(IEntityManager<T> manager);
    }
    
  4. J'utilise ce contrôleur de base dans mon CDController Code> (où CDManager code> implémente l'interface ientinityManager code>, qui est un motif de référence pour ajouter Fonctionnalité CRUD): P>

    public class CD : IEntity
    {
        public long Id { get; set; }
    
        public long Name { get; set; }
    }
    


5 commentaires

Beaucoup de choses extérieures sont renvoyées. Qu'est-ce que l'Ientitilité, CD, CDManager? Et votre base n'a-t-elle pas besoin d'un CTOR? Seriez-vous capable de fournir une représentation minimale construite sur une application Clean MVC3, de sorte que je pouvais facilement essayer de reproduire? Je suis sûr que nous pouvons ensuite trouver un correctif ou une solution de contournement.


David, j'ai ajouté d'autres détails. S'il-vous-plaît évaluez.


Je suis encore confus. Comment le CDController Ctor a-t-il une base (nouveau CDManager ()) lorsque l'entitéController n'a pas de contrôleur correspondant?


Ajout de plus de détails sur EntityController


Avoir le même problème ... ne peut pas obtenir T4MVC de générer une définition correcte où j'ai un contrôleur générique (pour la réutilisation dans divers projets) qui est hérité dans chaque projet, il peut donc être lié à MVC. {Controlername}. {Action }


3 Réponses :


2
votes

Je vois le problème, et cela revient à T4MVC ne fait pas tout à fait la bonne chose lorsqu'il s'agit de classes génériques. Normalement, cela générerait un CTOR par défaut pour celui-ci dans une classe partielle, mais le fait que c'est générique le jette.

Vous devriez être capable de contourner simplement simplement en ajoutant un CTOR par défaut vous-même, par exemple P>

public abstract partial class EntityController<T> : Controller where T : class, IEntity {
    public EntityController() { }

    // etc...
}


0 commentaires

7
votes

Je voulais que la classe de base du contrôleur soit abstraite et son constructeur protégé et paramétré. Je me suis heurté à ce problème en ajoutant un constructeur vierge à contrôleurbase qui jette une exception notimpleedException.

ne se sent pas bien, mais cela fait le travail. Seule problème est lorsque combiné avec une injection de dépendance Le mauvais constructeur sera appelé - puisqu'il jette une exception, l'application sera une exception. P>

code: p>

public abstract class ControllerBase : Controller
{
    protected object AlwaysSupply { get; private set; }

    public ControllerBase()
    {
        throw new NotImplementedException();
    }

    public ControllerBase(object alwaysSupply)
    {
        AlwaysSupply = alwaysSupply;
    }
}


1 commentaires

Avez-vous trouvé des solutions de contournement qui ne cassent pas l'injection de dépendance?



0
votes

J'ai remarqué quelque chose de très étrange:

J'ai ajouté le constructeur vide à la classe de base, mais sans le jette nouvelle notimplementeedException (); et ça marche bien.

Mais voici la chose étrange, lorsque vous appelez le contrôleur si j'ai une URL comme / {contrôleur}? paramiques (action par défaut étant définie sur Index dans le routage routier) Le contrôleur privé sans paramètre sur la classe de base est appelé. Mais quand j'ai une URL comme / {contrôleur} / {action}? Paramètres puis le constructeur avec les paramètres est appelé.


0 commentaires