从托管环境外部访问ASP.NET MVC路径

时间:2011-07-04 16:11:13

标签: c# asp.net asp.net-mvc asp.net-mvc-3 path

背景 我有一个带有数据库的ASP.NET MVC3应用程序。我还有一个复杂的控制台应用程序,其中(除其他外)初始化Web应用程序的数据库:生成,添加约束,添加sprocs,添加触发器,种子等。我无法将控制台逻辑移动到Web应用程序中(不会使在我们的建筑中感觉。)

问题: 控制台应用显然未在托管环境中运行,因此无法访问HostingEnvironmentMapPathHttpContext.CurrentServer.MapPath~等。但我需要从控制台应用程序访问Web应用程序的路径。此外,控制台应用程序调用Web应用程序,然后通常使用这些类,但这些类当然都是null或未定义。

问题: 有没有办法欺骗其中一个类,以便我可以访问托管环境的路径机制,即使它没有运行?

我可以将我需要的所有路径硬编码到控制台应用程序中,但这是非常不受欢迎的。

我认为这应该是可能的,因为单元测试需要相同的需求。

TIA

5 个答案:

答案 0 :(得分:1)

编写一个小型Web服务并从Web应用程序中公开所需数据,然后从控制台应用程序中调用它

答案 1 :(得分:1)

我做了什么(虽然我不是很喜欢):

我们有一个静态Paths类,它包含系统中每个主要资源路径的private static readonly个字符串,而不是散布Web应用程序周围的各种路径(T4MVC不具备的路径)帮助我们)。每当我需要一个通向任何东西的路径时,我会问这个类,并且它会对字符串中的字符串执行必要的Path.Combine()等等 - 因此结果是所有硬编码字符串都存在于一个干净且易于维护的类中。

所以我在该类中添加了一个属性public static string ApplicationRootPath { get; }(注意公共,缺少readonly),以及一个静态构造函数,根据您的使用情况将其初始化为ApplicationRootPath = HostingEnvironment.MapPath("~");"/"情况下。

然后,从控制台应用程序,我可以覆盖" root"目录Paths.ApplicationRootPath = "some absolute or relative path here";。在那一行之后,我可以访问Web应用程序中的所有路径,这些路径都有效。

实际上它很整洁,但仍然不理想。除非有人有更好的想法,否则我会接受这个答案。

答案 2 :(得分:0)

Moq非常适合模拟您需要的MVC3上下文。它很容易设置,您可以覆盖通常在Web上下文中运行的方法和属性,以返回您想要的对象。

不要试图进一步解释,而是从这里开始:

How do I mock the HttpContext in ASP.NET MVC using Moq?

MVC 3 Unit Test - Get Actual Response Data

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/

答案 3 :(得分:0)

您可以尝试使用StructureMap(或其他一些IoC框架)来实现此功能。 在我正在处理的项目中,我们已将HttpContextBase连接到网站中的HttpContext.Current对象。 这样我们就可以在任何环境中使用HttpContext功能。

对于我们的单元测试,我们使用的是一些存储/模拟对象,它与HttpContextBase重叠。您要使用的大多数对象都有一个可用于设置接线的接口或基类。 对于模拟.NET Framework,您可以尝试Pex & Moles。它应该能够这样做,或者我被告知。我自己没用过,但它看起来很整洁!

答案 4 :(得分:0)

有一些漂浮在周围。在大多数情况下,您只需要1或2个配置值,然后就可以非常有效地计算路径。值#1是Web应用程序的根目录 - 从那里您可以轻松地构建任何资源的URL。值#2是Web应用程序的物理位置,如果在这种情况下实际上很重要。