有没有理由使用Server.MapPath()来引用文件存储?

时间:2011-08-09 18:50:51

标签: c# asp.net

我见过几位开发人员表演:

string fileStore = Server.MapPath(@"~\someDirectory");
File.Create(fileStore + "someFileName.xxx");

我发现这使单元测试变得困难。由于我使用MSTest进行测试,因此没有HTTP上下文,因此这个代码只是扁平化失败。

相反,我将文件路径存储在web.config中。

string fileStore = ConfigurationManager.AppSettings["fileStore"];

这适用于单元测试。为什么开发人员会以这种方式使用Server.MapPath()?是否有一些我不知道的好处?

3 个答案:

答案 0 :(得分:3)

我认为两种方式都是完全有效的。

Server.MapPath更容易阅读,但更难测试 但请记住,ASP .NET根本不支持单元测试(在MVC之前)。

就个人而言,我倾向于创建一个目录服务,为我提供路径:

public interface IDirectoryService {
    string MapPath(string relative);
}

public DirectoryService : IDirectoryService {
    public string MapPath(string relative)
    {
        return Server.MapPath(relative);
    }
}

当我进行单元测试时,我只是模拟它以返回对测试有意义的东西。

答案 1 :(得分:1)

Server.MapPath()将指定的相对或虚拟路径映射到服务器上的相应物理目录。这将始终相对于包含代码的文件,因此没有真正的错误空间。您始终可以使用外部文件来存储“全局变量”,例如您的web.config文件。

这两种解决方案都是可行的,并且可能还有更多的解决方案。我认为在这种情况下最重要的是哪一个更适合您的需求。

答案 2 :(得分:1)

当您不控制自己的托管环境时,可能无法知道完整路径。您必须在该方面依赖Server.MapPath()。将它存储在AppSettings中会假定您事先了解完整路径。