我见过几位开发人员表演:
string fileStore = Server.MapPath(@"~\someDirectory");
File.Create(fileStore + "someFileName.xxx");
我发现这使单元测试变得困难。由于我使用MSTest进行测试,因此没有HTTP上下文,因此这个代码只是扁平化失败。
相反,我将文件路径存储在web.config中。
string fileStore = ConfigurationManager.AppSettings["fileStore"];
这适用于单元测试。为什么开发人员会以这种方式使用Server.MapPath()
?是否有一些我不知道的好处?
答案 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中会假定您事先了解完整路径。