NHibernate-Ausnahme: Methode Add sollte 'public / protected virtual' oder 'protected internal virtual' sein

8

Nehmen Sie diese Klasse als Beispiel:

%Vor%

Beim Ausführen der Anwendung ohne das virtuelle Schlüsselwort add Methode bekomme ich diesen Fehler:

%Vor%

Ich verstehe, warum Eigenschaften als virtuell deklariert werden müssen, da sie durch das Feature zum verzögerten Laden überschrieben werden müssen.

Aber ich verstehe nicht, warum Methoden deklariert werden müssen als virtuell ... sie müssen aus welchem ​​Grund überschrieben werden?

Das ist sehr verwirrend!

    
Fitzchak Yitzchaki 17.02.2010, 03:27
quelle

2 Antworten

10

Auch Methoden müssen virtuell sein, da sie auf Felder zugreifen können. Betrachten Sie diese Situation:

%Vor%     
Stefan Steinegger 22.03.2010, 14:54
quelle
4

Ich glaube, dass dies für die Lazy-Loading-Funktion in NHibernate erforderlich ist, in der NHibernate Proxys Ihrer Entität erstellt und den gesamten Zugriff darauf steuert. Aus diesem Grund muss jede einzelne Methode und Eigenschaft virtuell sein. Wenn es ein Mitglied gibt, das irgendetwas mit der Entität macht, muss NH davon wissen und es anzapfen. Wie bereits erwähnt, erstellt NHibernate die Magie, um Proxy-Klassen zu erstellen, die von Ihren Entitäten (Kategorie in Ihrem Fall) erben. Wenn Sie jedoch Ihre Entitäten dazu veranlassen, eine Schnittstelle zu implementieren, wird diese Schnittstelle verwendet, um einen Proxy anstelle von konkreten Typen zu erstellen. Auf diese Weise müssten Sie nicht alles virtuell markieren.

EDIT: Einige Korrekturen ... Nach dies Ich bin gezwungen zu sagen, dass es fast so aussieht, als würde NH mit virtuellen Methoden nichts anfangen. Und ich las sogar jemanden, der sagte, dass diese Laufzeitprüfung von der NH-Kernbaugruppe entfernt wurde, nur um es zu umgehen. Meine Annahme wäre, dass es sich um ältere Anforderungen handelt, die nicht entfernt wurden. Die coole Sache ist, dass es aussieht, als gäbe es eine Initiative, PostSharp für statische Proxies zu verwenden, also müssen Ihre Klassen nichts virtuell deklarieren, damit NH Proxies generiert. Das Schlimme ist, dass es so aussieht, als wäre es seit fast zwei Jahren in einem Zweig steckengeblieben.

    
Sergey 17.02.2010 03:46
quelle

Tags und Links