2009-03-02 10 views
1

Ich habe ein asp.net mvc-Projekt, das einige Suchmethoden in einer separaten Bibliothek verwendet. Diese Bibliothek muss den Speicherort meiner Lucene-Indexdateien kennen.Ermitteln des korrekten absoluten Pfads in der vom Webprojekt verwendeten Bibliothek

Das liest korrekt meinen konfigurierten lucenePath aus dem Anwendungsschlüsselknoten web.config. Aber wie kann ich den korrekten vollständigen Pfad von diesem relativen Pfad erhalten? Path.GetFullPath gibt mir einen völlig falschen Pfad.

--Conclusion--
Wenn Sie voll-out gehen wollen, ist tvanfosson ‚s Antwort für Sie wahrscheinlich.
I, hielt es jedoch ein wenig mehr hirntot durch die folgende Verwendung:

Path.Combine(AppDomain.CurrentDomain.BaseDirectory, 
    ConfigurationManager.AppSettings["luceneIndex"].TrimStart('\\')); 

Das in der app.config des Anrufers für einen appkey aussehen wird „Pfad“ genannt, und dessen Wert auf den Pfad des Anrufers kombinieren. Der TrimStart() stellt sicher, dass die Konfigurationsdatei sowohl ein vorangestelltes als auch nicht enthalten kann.

Antwort

0

Da Sie dies aus einer separaten Bibliothek verweisen, könnten Sie haben durch ein Bündel von Reifen springen Zugang zum HttpServerUtitity zu bekommen oder eine Kopplung an Klassen einzuführen, die schwer zu verspotten. Möglicherweise möchten Sie eine einzelne Konfigurationsklasse in Betracht ziehen, die Eigenschaften aus der Webkonfiguration lädt, die über Konstruktor/Setter in Ihre Bibliothek eingefügt wird. Um es einfacher zu machen, dagegen zu testen, könnten Sie eine Schnittstelle definieren, die in Ihren Komponententests gespottet werden könnte und diese implementieren lassen. Die Konfigurationsklasse könnte die HttpServerUtility verwenden, um den absoluten Pfad abzurufen und intern zu speichern, um wiederverwendet zu werden.

+0

Gibt es keine Möglichkeit, die Abhängigkeit vollständig zu entfernen auf HttpServerUtility? Diese Bibliothek sollte auch von einer Nicht-Web-App konsumierbar sein ... Es fühlt sich komisch an, eine system.web lib in eine eigenständige Anwendung aufzunehmen. Nicht? –

+0

Sicher - Implementieren Sie zwei Versionen der Konfigurationsklasse, die die Schnittstelle implementieren. Der, der von der Website ausgeführt wird, lebt im Webcode und verwendet HttpServerUtility, um den Pfad zu finden. Die Anwendung, die von Ihrer eigenständigen Anwendung ausgeführt wird, kann die aktuell ausgeführte Assembly verwenden, um den Pfad der ausführbaren Datei abzurufen. – tvanfosson

+0

Beide können von einer gemeinsamen Basisklasse abgeleitet werden, die den Großteil der Logik implementiert (mithilfe von ConfigurationManager, nicht WebConfigurationManager), um den Code DRY beizubehalten. – tvanfosson

1
Server.MapPath(string); 
+0

Die Bibliothek sollte sowohl von der Website als auch von jeder anderen Anwendung aus nutzbar sein. Es sollte wirklich nur den aktuellen laufenden Pfad nehmen, den relativen Pfad anwenden und das Ergebnis zurückgeben. –

+0

Hmm .. vielleicht etwas von http://stackoverflow.com/questions/362790/what-is-the-best-way-to-determine-application-root-directory würde helfen – abatishchev

Verwandte Themen