Gibt es eine Möglichkeit, den Aufruf von Activator.CreateInstance() innerhalb von NHibernate 2.0.1GA zu ersetzen, um die Entitäten zu erstellen? Im Idealfall möchte ich es durch StructureMap.ObjectFactory.GetInstance() ersetzen.Kann ich den Aufruf von Activator.CreateInstance() in NHibernate ersetzen?
Antwort
Sie können dies nicht einfach mit Konstruktorinjektion tun. Die NHibernate-Interna müssen möglicherweise ein Proxy-Objekt erstellen, das von Ihrer Domain-Klasse mit Lazy-Ladecode usw. gestreut wurde. Daher gibt es, soweit ich weiß, keine einfache Möglichkeit, die Konstruktion Ihres Objekts zu überschreiben.
Sie können bekommen Abhängigkeit Injektion mit NHibernate ziemlich leicht, obwohl, indem Sie einen Interzeptor schreiben, der das Objekt für Sie über Property Setter-Injektion aufbauen wird. Es gibt ein Beispiel dafür here. In diesem Beispiel wird Windsor als DI-Container verwendet, aber Sie können dasselbe mit Structuremap natürlich tun - here are the relevant docs for StructureMap - suchen Sie nach dem Abschnitt "Setter-Injektion auf ein vorhandenes Objekt anwenden (BuildUp)".
Vorbehalt: Das Injizieren von Abhängigkeiten in Ihr Domänenmodell wird oft als Symptom eines Designproblems angesehen, und viele Menschen vermeiden dies, also stellen Sie sicher, dass dies wirklich der Fall ist, bevor Sie mit der Programmierung beginnen!
Sie können Setterintion durchführen, indem Sie IInterceptor implementieren und die Injektion in der Onload-Methode mit Objectfactory.BuildUp durchführen. Dies ist einfach zu implementieren, Setter-Injektion ist möglicherweise nicht das, was Sie wollen.
Sie können die Konstruktorinjektion durchführen, indem Sie Ihren eigenen IBytecodeProvider und ReflectionOptimizer implementieren. Das ist etwas schwieriger, aber es ist möglich!
Ich empfehle nicht, Dinge in Einheiten zu injizieren. In 99,9% der Fälle wird dies zu schlechtem Design führen und das Layering in Ihrem Design unmöglich machen. Vielleicht sehen Sie sich den 0,01% der Fälle gegenüber, in denen es richtig ist. Es ist etwas, was Sie tun, wenn Sie goto-Anweisungen eingeben.
Werfen Sie einen Blick auf this post from Fabio Maulo (aktuelle NHibernate Lead Dev), er löste dies vor einigen Monaten. Der Code ist für NHibernate 2.1, aber ich denke, dass es nach 2.0.1GA zurückportiert werden könnte, indem Sie die IProxyFactoryFactory-Teile entfernen.
- 1. Activator.CreateInstance kann nicht den Konstruktor (Missing) finden
- 2. Kann ich Activator.CreateInstance mit einer Schnittstelle verwenden?
- 3. Warum schlägt mein Aufruf von Activator.CreateInstance zeitweise fehl?
- 4. Activator.CreateInstance: Konnte den Typ von Assembly nicht laden
- 5. Wie kann ich den Standardkalender von Android OS ersetzen?
- 6. Activator.CreateInstance (String) und Activator.CreateInstance <T>() Unterschied
- 7. IndexOutOfRangeException Tief in den Eingeweiden von NHibernate
- 8. Activator.CreateInstance mit optionalen Parametern
- 9. Wie kann ich einen bereits deklarierten Stub-Aufruf durch einen anderen Stub-Aufruf ersetzen?
- 10. var Schlüsselwort mit Activator.CreateInstance?
- 11. Wie kann ich den Konstruktor aufrufen?
- 12. Activator.CreateInstance Performance Alternative
- 13. Kann ich die Sortierung von Abfrageergebnissen in nHibernate anpassen?
- 14. Activator.CreateInstance mit einem generischen Repository
- 15. Ich kann keine Attribute mit ldap_mod_replace ersetzen
- 16. Android Wie kann ich den veralteten Tabhost ersetzen?
- 17. Linux - Ersetzen von Leerzeichen in den Dateinamen
- 18. NHibernate und flüssiges NHibernate - Kann ich das Risiko eingehen?
- 19. LINQ und Activator.CreateInstance() erzeugt Duplikate
- 20. Wie wähle ich den Count (*) ein nHibernate Subquery der Ergebnisse
- 21. Activator.CreateInstance mit privaten versiegelten Klasse
- 22. Asp.Net Kern Wie kann ich den Configuration Manager ersetzen
- 23. Wie kann ich ein GWT-Widget in einem Panel ersetzen?
- 24. Wie kann ich null ersetzen?
- 25. Wie kann ich \ mit/in Java ersetzen?
- 26. Wie kann ich Zeichenfolge in jquery ersetzen
- 27. Kann ich in t-sql suchen/ersetzen?
- 28. Kann ich Variablen in JUnit-Fehlergründen ersetzen?
- 29. auf Zeichenfolge ersetzen Aufruf wirft EvaluatorException
- 30. Activator.CreateInstance und Generic Methode in C#
Konstruktor Injektion ist möglich – Paco
Ich habe nicht gesagt, dass es nicht möglich war Ich sagte, es war nicht einfach. Wenn ich falsch liege, bitte erleuchte mich :) –
Dann lese ich nicht gut. Es tut uns leid. – Paco