2009-03-02 3 views
1

私は別のライブラリでいくつかの検索メソッドを使用するasp.net mvcプロジェクトを持っています。 このライブラリは、私のluceneインデックスファイルの場所を知る必要があります。Webプロジェクトで使用されているライブラリの正しい絶対パスを取得する

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

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

これは、設定されたlucenePathをweb.configのアプリケーションキーノードから正しく読み取ります。 しかし、この相対パスから正しいフルパスを取得するにはどうすればよいですか? Path.GetFullPathは私に完全に間違ったパスを与えます。

--Conclusion--
あなたは完全なアウトに行きたい場合は、tvanfossonの答えはあなたのためにおそらくあります。
私は、しかし、次を使用して、もう少し脳が死んで、それを守っ:

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

これは、「パス」と呼ばれるAPPKEYのために、発信者のapp.configをで見て、呼び出し側のパスにその値を結合します。 TrimStart()は、設定ファイルに先頭に\が含まれているかどうかを確認します。

答えて

0

あなたが別のライブラリからこれを参照しているので、あなたはHttpServerUtitityへのアクセスを取得したり、模擬することが困難なクラスにいくつかのカップリングを導入するフープの束を介してジャンプする必要がある場合があります。コンストラクタ/セッターを介してライブラリに注入されたプロパティをWebコンフィグレーションから読み込む単一のコンフィグレーションクラスを持つことを検討してください。テストを簡単にするために、単体テストで嘲笑され、実装されたインタフェースを定義することができます。構成クラスでは、HttpServerUtilityを使用して絶対パスを取得し、内部的に再利用するために格納できます。

+0

依存関係を完全に削除する方法はありませんHttpServerUtilityについてこのライブラリは、非Webアプリケーションからも消耗しているはずです...スタンドアロンアプリケーションにsystem.web libを含めるのは気が気です。ない? –

+0

確かに、インターフェイスを実装する構成クラスの2つのバージョンを実装してください。 Webサイトから実行されているものはWebコード内にあり、HttpServerUtilityを使用してパスを検索します。あなたのスタンドアロンアプリから実行しているものは、現在実行中のアセンブリを使って実行可能ファイルのパスを取得できます。 – tvanfosson

+0

どちらも、コードをDRYに保つために(WebConfigurationManagerではなくConfigurationManagerを使用して)ほとんどのロジックを実装する共通基本クラスから派生することができます。 – tvanfosson

1
Server.MapPath(string); 
+0

このライブラリは、他のアプリケーションのようにWebサイトからも使用可能である必要があります。実際には現在の実行パスを取得し、相対パスを適用して結果を返す必要があります。 –

+0

Hmm ..多分http://stackoverflow.com/questions/362790/what-is-the-best-way-to-determine-application-root-directoryの助けを借りて – abatishchev

関連する問題