从宿主环境外部访问ASP.NET MVC路径
本文关键字:NET MVC 路径 ASP 访问 宿主 环境 外部 | 更新日期: 2023-09-27 18:00:59
背景:我有一个带有数据库的ASP.NET MVC3应用程序。我还有一个复杂的控制台应用程序,它(除其他外(初始化web应用程序的数据库:生成、添加约束、添加存储过程、添加触发器、种子等。我无法将控制台逻辑移动到web应用程序中(在我们的体系结构中没有意义(。
问题:控制台应用程序显然不是在托管环境中运行的,因此无法访问HostingEnvironment
、MapPath
、HttpContext.Current
、Server.MapPath
、~
等。但我需要从控制台应用程序访问web应用程序的路径。此外,控制台应用程序调用web应用程序,然后web应用程序正常使用这些类,但这些类当然都是null或未定义的。
问题:有没有办法欺骗其中一个类,这样我就可以访问托管环境的路径机制,即使它没有运行?
我可以将我需要的所有路径硬编码到控制台应用程序中,但这是非常不可取的。
我觉得这应该是可能的,因为单元测试也需要同样的需求。
TIA
编写一个小型web服务并从web应用程序公开所需的数据,然后从控制台应用程序调用它
我所做的(尽管我并不喜欢(:
我们没有在web应用程序中分散各种路径,而是有一个静态Paths
类,它包含系统中每个主要资源路径的private static readonly
字符串(T4MVC对我们没有帮助的路径(。每当我需要一个指向任何东西的路径时,我都会询问该类,它会对中的字符串执行必要的Path.Combine()
等操作——因此结果是,所有硬编码的字符串都存在于一个干净且易于维护的类中。
因此,我向该类添加了一个属性public static string ApplicationRootPath { get; }
(请注意公共属性和缺少只读属性(,以及一个静态构造函数,根据您的用例将其初始化为ApplicationRootPath = HostingEnvironment.MapPath("~");
或"/"
。
然后,从控制台应用程序中,我可以通过Paths.ApplicationRootPath = "some absolute or relative path here";
覆盖"根"目录。在那一行之后,我可以访问网络应用程序中的所有路径,这些路径都有效。
事实上,它很整洁,但仍然不理想。除非有人有更好的主意,否则我会接受这个答案。
Moq非常适合模拟您需要的MVC3上下文。它非常容易设置,并且您可以覆盖通常在web上下文下运行的方法和属性,以返回您想要的对象。
与其试图进一步解释,不如从这里开始:
如何使用Moq模拟ASP.NET MVC中的HttpContext?
MVC 3单元测试-获取实际响应数据
http://www.sharpedgesoftware.com/Blog/2011/03/14/mocking-a-controllercontext-with-authenticated-user-with-moq-for-aspnet-mvc-3
http://code.google.com/p/moq/
您可以尝试一个StructureMap(或其他IoC框架(来实现这一点。在我目前正在进行的一个项目中,我们已经将HttpContextBase
连接到网站中的HttpContext.Current
对象。通过这种方式,我们可以在任何环境中使用HttpContext
功能。
对于我们的单元测试,我们使用了一些从HttpContextBase
中重写的stub/mock对象。大多数要使用的对象都有一个接口或基类,可以用来设置连接。为了嘲弄.NET框架,你可以试试Pex&鼹鼠。它应该能够做到这一点,或者我被告知是这样。我自己没有用过,但看起来很整洁!
有一些这样的漂浮物。在大多数情况下,您只需要1或2个配置值,就可以非常有效地计算路径。值#1是web应用程序的根——从那里你可以很容易地构建到任何资源的url。值#2是web应用程序的物理位置,如果这在上下文中很重要的话。