2012-11-27 10 views
9

in meiner Asp.Net MVC 4 WebApi-Anwendung Ich möchte zusätzliche WebApiController zu einem späteren Zeitpunkt (nach der WebApi-Initialisierung), die sich in separaten Assemblies befinden, dynamisch laden. Außerdem möchte ich zur Laufzeit Routen für diese Controller hinzufügen.ASP.Net WebApi: So laden Sie zusätzliche Controller zur Laufzeit

Ich frage mich, ob das möglich ist.

Mein Ziel ist es, eine Web-App zu erstellen, wo ich Controller (kompilierte Assemblies) hochladen kann und die Controller automatisch in dieser Anwendung gehostet werden.

Ich habe bereits versucht, das zu erreichen, indem ich meine eigene AssemblyResolver-Klasse implementiere, aber (wie ich gesehen habe), wird der AssemblyResolver einmal in der Initialisierungsphase geladen.

Möglicherweise gibt es eine Option zum "Neuladen" aller Controller.

Jede Hilfe wird geschätzt!

Marius

+0

http://www.dotnetcurry.com/ShowArticle.aspx?ID=898 haben Sie gesehen. –

+0

Ein ehemaliger Kollege von mir hat etwas fast identisches in unserem System arbeiten. Ich weiß, dass er [MEF] (http://msdn.microsoft.com/en-us/library/dd460648.aspx) verwendet hat, um das dynamische Laden von Baugruppen zu verwalten, aber ich erinnere mich nicht an die Besonderheiten. Ich habe ihm einen Link zu diesem Post geschickt, vielleicht wird er zu dir zurückkommen. In der Zwischenzeit können Sie selbst versuchen, eine Lösung mit MEF zu finden. – gzak

Antwort

2

könnten Sie Web API Abhängigkeitsauflöser verwenden:

public class WebApiApplication : System.Web.HttpApplication 
{ 
    void ConfigureApi(HttpConfiguration config) 
    { 
     config.DependencyResolver = new MyDependencyResolver(); 
    } 

    protected void Application_Start() 
    { 
     ConfigureApi(GlobalConfiguration.Configuration); 

     // ... 
    } 
} 

Using the Web API Dependency Resolver

2

Vielen Dank für Ihre Antworten.

Ich habe es herausgefunden, das ist nicht möglich, da alle Controller einmal geladen sind und die ganze Zeit zwischengespeichert werden.

Siehe HttpControllerTypeCache in DefaultHttpControllerSelector Methode InitializeControllerInfoCache (...).

Um eine Typ-Cache-Aktualisierung durchzuführen, muss ich einen benutzerdefinierten HttpControllerSelector implementieren.

0

Was ist, wenn in Global.asax Sie alle Baugruppen in einem bestimmten Ordner geladen und dann für eine Klasse angesehen, die eine bestimmte Schnittstelle implementiert, zum Beispiel

Leere RegisterControllers (Routecollection Wege);

Erstellen Sie eine Instanz und übergeben Sie dann Ihre Routensammlung. Dies würde dann die zusätzlichen Routen beim Start der Website registrieren.

+0

Hallo Peter, ich möchte zu einem späteren Zeitpunkt weitere WebAPi-Controller dynamisch laden (wenn die Website bereits läuft). Ich weiß, wie man Controller in global.asax lädt, aber das passiert nur einmal - beim Start. – Marius

+0

Startet IIS die Webanwendung nicht trotzdem, wenn Sie den Inhalt des Binärdateiordners ändern? –

Verwandte Themen