【问题标题】:Use Server.MapPath in Business Layer在业务层中使用 Server.MapPath
【发布时间】:2012-08-30 22:35:44
【问题描述】:

我的业务层创建文件,需要将它们保存在我的 asp.net mvc 4 web 前端的App_Data 文件夹中。

我可以在业务层使用Server.MapPath 来获取App_Data 文件夹的物理路径。但我想避免在业务层引用System.Web

还有其他方法可以在业务层获取App_Data 的路径吗?

【问题讨论】:

    标签: c# asp.net-mvc server.mappath business-layer


    【解决方案1】:

    处理这个问题的正确方法是让表示层将路径传递到业务层。

    换句话说,拥有业务层的目的是在 ui 和业务流程之间创建关注点分离。如果您强制业务流程了解 ui 层,那么您就违反了关注点分离。

    有很多方法可以解决这个问题。您可以在构建业务层时将路径传递到业务层,例如通过构造函数初始化或通过依赖注入。或者你可以将它传递给方法调用。或者您可以创建某种形式的配置文件,您的业务层加载该文件包含路径。

    有很多不违反关注点分离的方法。

    【讨论】:

      【解决方案2】:

      你可以使用

      string  path = System.AppDomain.CurrentDomain.BaseDirectory+"App_Data";
      

      【讨论】:

      • 其实我喜欢这种方法。它不会在 ASP.NET 上创建任何依赖项,并且仅使用任何 .NET 应用程序共有的依赖项。唯一需要担心的是,如果您不小心,它确实会在某种程度上与操作系统相关联。
      【解决方案3】:
      string path = HostingEnvironment.MapPath("~\\App_Data");
      

      对我有用

      【讨论】:

      • HostingEnvironment 是 System.Web 的一部分
      【解决方案4】:

      我知道这是一个老问题,但仍然是一个非常有效的问题。我已经在这里看到了所有答案,我想在这里写下所有知识中最好的笔记。

      1. 建议不要使用System.Web 程序集,因为它与 S.O.L.I.D 原则相冲突。 例如,如果我们使用System.Web 并尝试在 Windows 窗体/控制台/WPF 应用程序中使用该 DLL,那么在这种情况下上下文将始终保持为空。
      2. 例如,您可以访问文件夹App_data 文件夹下的data.txt 文件。在 DLL 中,您应该使用以下代码

        string rootDirectoryPath = AppDomain.CurrentDomain.BaseDirectory; string pathFinalAccessFile = Path.Combine(rootDirectoryPath, "App_Data", "data.txt");

      您应该使用 C# 中的 Path.Combine 方法(如上面的代码所示),而不是手动附加路径和文件名。。 p>

      【讨论】:

      • 谁能指导我为什么我的回答被否决了?
      • 很可能是因为您只是在其他帖子中重复了信息,除了使用 Path.Combine 之外。
      猜你喜欢
      • 2011-06-16
      • 2011-04-17
      • 2012-06-12
      • 1970-01-01
      • 2013-05-18
      • 2012-02-23
      • 2011-11-17
      • 2012-05-11
      • 2016-08-20
      相关资源
      最近更新 更多