【问题标题】:Getting correct absolute path in library used by web project在 Web 项目使用的库中获取正确的绝对路径
【发布时间】:2010-10-10 18:39:19
【问题描述】:

我有一个 asp.net mvc 项目,它在一个单独的库中使用了一些搜索方法。 这个库需要知道我的 lucene 索引文件的位置。

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

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

这会从 web.config 的应用程序关键节点正确读取我配置的 lucenePath。 但是我怎样才能从这个相对路径中得到正确的完整路径呢? Path.GetFullPath 给了我一个完全错误的路径。

--结论--
如果您想全力以赴,tvanfosson 的答案可能适合您。
但是,我通过使用以下方法使其脑死亡更多:

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

这将在调用者的 app.config 中查找名为“path”的 appkey,并将其值与调用者的路径结合起来。 TrimStart() 确保配置文件可以包含前导 \ 或不包含。

【问题讨论】:

    标签: c# absolute-path


    【解决方案1】:

    由于您从一个单独的库中引用它,您可能不得不跳过一堆圈来访问 HttpServerUtitity 或引入一些与难以模拟的类的耦合。您可能需要考虑使用一个配置类,该类从 Web 配置中加载属性,这些属性通过构造函数/设置器注入到您的库中。为了更容易进行测试,您可以定义一个可以在单元测试中模拟的接口并让它实现它。配置类可以使用 HttpServerUtility 获取绝对路径并在内部存储以供重复使用。

    【讨论】:

    • 有没有办法完全去除对HttpServerUtility的依赖?这个库也应该可以从非 Web 应用程序中使用……在独立应用程序中包含 system.web 库感觉很奇怪。没有?
    • 当然——实现两个版本的实现接口的配置类。从网站运行的程序位于 Web 代码中,并使用 HttpServerUtility 来查找路径。从您的独立应用程序运行的那个可以使用当前正在执行的程序集来获取可执行文件的路径。
    • 两者都可以派生自一个通用基类,该基类实现了大部分逻辑(使用 ConfigurationManager,而不是 WebConfigurationManager)以保持代码 DRY。
    【解决方案2】:
    Server.MapPath(string);
    

    【讨论】:

    • 该库应该可以在网站和任何其他应用程序中使用。它应该只取当前运行路径,应用相对路径并返回结果。
    • 嗯.. 可能来自stackoverflow.com/questions/362790/… 的东西会有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2018-12-27
    • 1970-01-01
    相关资源
    最近更新 更多