NHibernate 3.2 / Fließfähiges NHibernate 1.3 / StructureMap 2.6.3 -
Beim Versuch, DDD als Architekturstrategie zu folgen, habe ich normalerweise keine Abhängigkeiten von Domäneneinheiten. Ich experimentiere jedoch gerade damit, meinen Domain-Entitäten mehr Verhalten hinzuzufügen, damit sie nicht so blutarm sind. Alles lief gut, bis ich NHibernate angeschlossen habe. Ich habe zwei Probleme:
Ich habe im Internet gelesen, aber die meisten (wenn nicht alle) Beispiele, die ich gefunden habe, sind veraltet (oder einfach nur alt). Obwohl das NH-Camp wahrscheinlich nicht einverstanden ist mit dem, was ich tue, suche ich nach dem NH-Weg, dies zu tun.
Die Lösung endete mit einer Implementierung von NHibernate's IInterceptor. Es ist tatsächlich eine sehr einfache Implementierung, wenn Sie von EmptyInterceptor erben und JUST die Methoden Instantiate () und SetSession () überschreiben. Hier ist mein Abfangjäger, der StructureMap verwendet:
%Vor%Dann musst du NHibernate nur sagen, dass du deinen Interceptor verwenden sollst:
%Vor%Als ich das recherchierte, schlugen einige vor, die SessionFactory in den ctor der Interceptor-Klasse zu geben. Ehrlich gesagt wäre dieser Ansatz aus Sicht des Session Managements besser.
Wenn Sie zusätzliche Abhängigkeiten in Ihren Entitäten benötigen, verwenden Sie nicht die Konstruktorinjektion. Erstellen Sie stattdessen einen zusätzlichen Parameter in der Entitätsmethode.
Nun werden Sie sich fragen, wie Sie die Abhängigkeit bekommen. Dazu können Sie CommandHandler und Commands verwenden. Der Befehlshandler übernimmt die Abhängigkeit innerhalb seines Konstruktors und ruft die Methode der Entität auf. In der Benutzeroberfläche erstellen Sie eine Befehlsnachricht und senden sie an einen Befehlsprozessor, der für das Aufrufen des richtigen Befehlshandlers verantwortlich ist.
Ich hoffe, meine Erklärung ist für Sie nachvollziehbar.
Domäne:
%Vor% Die Infrastrukturkomponente INotifier
wird über die Methode und nicht über den Konstruktor übergeben!
Infrastruktur:
%Vor%Befehl und CommandHandler:
%Vor%Der CommandHandler ruft den INotifier durch die Konstruktorinjektion ab. Sie müssen Ihren IoC Container also nicht wie einen ServiceLocator verwenden.
Verwendung, d.h. in der Benutzeroberfläche in einem Controller:
%Vor%Wenn Sie Fragen zum Befehlsprozessor haben, schauen Sie sich das Projekt mvccontrib an oder stellen Sie eine separate Frage.
Leider hat meine vorherige Antwort die spezifische Frage nicht angesprochen. Ich habe noch mehr recherchiert und es sieht so aus, als ob ich noch viel mehr darüber lernen müsste, wann und wann ich kein anämisches Domänenmodell verwenden sollte. In Bezug auf Ihre Frage fand ich diesen Artikel sehr gut Thema. Es ist auf Java, nicht c #, aber die Prinzipien sind die gleichen. Hoffe, das hilft.
Tags und Links nhibernate structuremap