t4mvc: Kann eine Controller-Klasse, die keinen Standardkonstruktor hat, nicht erben?

8

Ich verwende T4MVC mit MVC2.

Ich habe die folgenden Bausteine:

  1. Eine einfache Entity-Schnittstelle, die definiert, dass jede POCO-Entität eine long Id -Eigenschaft haben muss:

    %Vor%
  2. Eine einfache POCO-Klasse, die die IEntity -Schnittstelle implementiert und einige String-Eigenschaften hat:

    %Vor%
  3. Ein Basiscontroller:

    %Vor%
  4. Ich verwende diesen Basiscontroller in meinem CDController (wobei CDManager das Interface IEntityManager implementiert, das ein UnitOfWork-Muster zum Hinzufügen von CRUD-Funktionen ist):

    %Vor%

Wenn ich meine t4-Vorlage ausführe, wird dieser Code generiert:

%Vor%

Aber das gibt mir einen Fehler beim Kompilieren:

  

MyApp.EntityController & lt; CD & gt; enthält keinen Konstruktor, der 0 Argumente

akzeptiert

Wie kann ich das lösen?

    
Stef Heyenrath 18.07.2011, 09:34
quelle

3 Antworten

7

Ich wollte von der Controller-Basisklasse abstrakt sein und sie ist konstruktorgeschützt und parametrisiert. Umgehung dieses Problems, indem ControllerBase einen leeren Konstruktor hinzugefügt wird, der eine NotImplementedException auslöst.

Fühlt sich nicht ganz richtig an, aber es macht den Job erledigt. Das einzige Problem ist, wenn in Verbindung mit der Abhängigkeitsinjektion der falsche Konstruktor aufgerufen wird - da es eine Ausnahme auslöst, wird die App ausgebrannt.

Code:

%Vor%

Dies wird dazu führen, dass T4MVC kompilierbaren Code erzeugt. Der Fehler scheint zu sein, dass es immer versucht, einen leeren (kein Parameter) -Konstruktor für Controller-Klassen zu erzeugen.

Hoffe das hilft jemandem.

    
Ales Potocnik Hahonina 27.06.2012 14:21
quelle
2

Ich sehe das Problem und es kommt darauf an, dass T4MVC nicht richtig mit generischen Klassen umgeht. Normalerweise würde es in einer partiellen Klasse einen Standard-Ctor dafür erzeugen, aber die Tatsache, dass es generisch ist, verwirft es.

Sie sollten in der Lage sein, einfach zu arbeiten, indem Sie ein Standard-ctor selbst hinzufügen, z. B.

%Vor%     
David Ebbo 19.07.2011 05:59
quelle
0

Ich habe etwas sehr merkwürdiges bemerkt:

Ich habe den leeren Konstruktor zur Basisklasse hinzugefügt, aber ohne throw new NotImplementedException(); und es funktioniert gut.

Aber hier ist das Seltsame, wenn ich den Controller anrufe, wenn ich eine URL habe   / {controller}? params (Standardaktion wird in RouteConfig auf Index gesetzt) ​​Der parameterlose private Controller der Basisklasse wird aufgerufen. Aber wenn ich eine URL wie / {controller} / {aktion}? Params habe, wird der Konstruktor mit Parametern aufgerufen.

    
Mihai Dabiste 13.11.2015 09:09
quelle

Tags und Links