2009-03-02 5 views
1

J'ai un projet mvc asp.net qui utilise des méthodes de recherche dans une bibliothèque séparée. Cette bibliothèque a besoin de connaître l'emplacement de mes fichiers d'index lucene.Obtention du chemin absolu correct dans la bibliothèque utilisée par le projet Web

private static string lucenePath = ConfigurationManager.AppSettings["lucenePath"]; 

    public static ColorList SearchColors(Query query) { 
     return new ColorList(
      new IndexSearcher(Path.GetFullPath(lucenePath)), 
      query); 
    } 

Ceci lit correctement ma configuration de lucenePath à partir du nœud de clé d'application web.config. Mais comment puis-je obtenir le chemin complet correct à partir de ce chemin relatif? Path.GetFullPath me donne un chemin complètement incorrect.

--Conclusion--
Si vous voulez aller plein-out, la réponse de tvanfosson est probablement pour vous.
I, cependant, gardé un peu plus de mort cérébrale en utilisant les éléments suivants:

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

Cela regardera dans un appkey appelé « chemin » de app.config de l'appelant et de combiner sa valeur au chemin de l'appelant. Le TrimStart() s'assure que le fichier de configuration peut contenir un \ ou non.

Répondre

0

Puisque vous faites référence à cette d'une bibliothèque séparée, vous pourriez avoir à sauter à travers un tas de cerceaux pour avoir accès au HttpServerUtitity ou d'introduire un certain couplage à des classes qui sont difficiles à se moquer. Vous pouvez envisager d'avoir une seule classe de configuration qui charge les propriétés de la configuration Web qui est injectée dans votre bibliothèque via constructeur/setter. Pour le rendre plus facile à tester, vous pouvez définir une interface qui pourrait être ridiculisée dans vos tests unitaires et l'implémenter. La classe de configuration pourrait utiliser HttpServerUtility pour obtenir le chemin absolu et le stocker en interne pour être réutilisé.

+0

Y at-il aucun moyen de supprimer complètement la dépendance sur HttpServerUtility? Cette bibliothèque devrait être consommable à partir d'une application non-web aussi ... C'est bizarre d'inclure une librairie system.web dans une application autonome. Ne pas? –

+0

Sure - implémente deux versions de la classe de configuration implémentant l'interface. Celui qui tourne depuis le site web vit dans le code web et utilise HttpServerUtility pour trouver le chemin. Celui qui s'exécute depuis votre application autonome peut utiliser l'assembly en cours d'exécution pour obtenir le chemin de l'exécutable. – tvanfosson

+0

Les deux peuvent dériver d'une classe de base commune qui implémente la majeure partie de la logique (en utilisant ConfigurationManager, pas WebConfigurationManager) pour garder votre code DRY. – tvanfosson

1
Server.MapPath(string); 
+0

La bibliothèque devrait être utilisable à partir du site Web comme de toute autre application. Il devrait vraiment juste prendre le chemin courant, appliquer le chemin relatif et retourner le résultat. –

+0

Hmm .. peut-être quelque chose de http://stackoverflow.com/questions/362790/what-is-the-best-way-to-determine-application-root-directory aiderait – abatishchev

Questions connexes