2009-02-20 12 views
11

Ich habe eine Design-Idee für ein großes Projekt bei der Arbeit und ich denke, ich habe es herausgefunden, würde aber wirklich gerne ein Feedback über a) die Idee im Allgemeinen und b) mein vorgeschlagen Implementierung.Hinzufügen einer Controller-Fabrik zu ASP MVC

Die Grundidee ist einfach: Ich möchte eine ASP MVC-Anwendung erstellen, die in der Zukunft mit zusätzlichen Controllern und Views erweitert werden kann, ohne den Code neu kompilieren zu müssen. Die Idee besteht darin, eine MVC-Anwendung mit sehr einfachen Funktionen zu erstellen und dann die Funktionalität zu erweitern, indem eine weitere "Application.dll" hinzugefügt wird, die Controller, Daten und Geschäftslogik für diese Anwendung enthält. Die Ansichten werden einfach kopiert in das gleiche Verzeichnis wie die MVC-Hauptanwendung während der Installation

Das Problem ist, dass MVC sein Routing auf Typen innerhalb der gleichen Assembly, selbst wenn ich die Routing-Definitionen in die Datenbank verschieben, die MvcHttpHandler würde nicht routen können alles auf die neue Dll, da es die Controller-Typen darin nicht "kennt". Wenn ich den MVC-Code ansehe, habe ich festgestellt, dass er Activator.CreateInstance aufruft, das nur in der aktuellen Baugruppe aussieht.

Meine Lösung ist einfach, aber vielleicht fehlt mir etwas: Ich werde den MvcHttpHandler überschreiben, indem ich entweder ControllerFactory direkt (nicht sicher, wie das geht) oder durch Duplizieren dieser Funktionalität in einer abgeleiteten Klasse ersetzen. Der neue Code liest die Anfrage und versucht, den Controller zuerst von der aktuellen Assembly und dann von den erweiterten zu laden. Sobald die richtige Assembly gefunden wurde, werde ich CreateInstance verwenden und diese Assembly an sie übergeben, um den gewünschten Controller zu erhalten.

Antwort

6

Das Ende this article zeigt, wie Sie Ihre eigene ControllerFactory implementieren. Im Grunde genommen leiten Sie von DefaultControllerFactory ab und verbinden es dann in Application_Start() in Ihrem global.asax.

+0

Danke, Ben. Das habe ich gesucht. – Gil

1

Es ist nichts falsch mit der Idee einer Controller-Fabrik, solange es nur für Flexibilität später ist. Das Problem ist, wenn Sie die Controller mit Code laden, der in andere Schichten gehört, was ein Grund ist, warum Sie die Flexibilität anderer Controller "brauchen". Solange du keine Schichten zusammen maschst, sehe ich kein wirkliches Problem mit der Fabrikidee.