Ich verwende T4MVC mit MVC2.
Ich habe die folgenden Bausteine:
Eine einfache Entity-Schnittstelle, die definiert, dass jede POCO-Entität eine long Id
-Eigenschaft haben muss:
Eine einfache POCO-Klasse, die die IEntity
-Schnittstelle implementiert und einige String-Eigenschaften hat:
Ein Basiscontroller:
%Vor% Ich verwende diesen Basiscontroller in meinem CDController
(wobei CDManager
das Interface IEntityManager
implementiert, das ein UnitOfWork-Muster zum Hinzufügen von CRUD-Funktionen ist):
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?
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.
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%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.
Tags und Links controller constructor t4mvc