背景 我有一个带有数据库的ASP.NET MVC3应用程序。我还有一个复杂的控制台应用程序,其中(除其他外)初始化Web应用程序的数据库:生成,添加约束,添加sprocs,添加触发器,种子等。我无法将控制台逻辑移动到Web应用程序中(不会使在我们的建筑中感觉。)
问题:
控制台应用显然未在托管环境中运行,因此无法访问HostingEnvironment
,MapPath
,HttpContext.Current
,Server.MapPath
,~
等。但我需要从控制台应用程序访问Web应用程序的路径。此外,控制台应用程序调用Web应用程序,然后通常使用这些类,但这些类当然都是null或未定义。
问题: 有没有办法欺骗其中一个类,以便我可以访问托管环境的路径机制,即使它没有运行?
我可以将我需要的所有路径硬编码到控制台应用程序中,但这是非常不受欢迎的。
我认为这应该是可能的,因为单元测试需要相同的需求。
TIA
答案 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?
答案 3 :(得分:0)
您可以尝试使用StructureMap(或其他一些IoC框架)来实现此功能。
在我正在处理的项目中,我们已将HttpContextBase
连接到网站中的HttpContext.Current
对象。
这样我们就可以在任何环境中使用HttpContext
功能。
对于我们的单元测试,我们使用的是一些存储/模拟对象,它与HttpContextBase
重叠。您要使用的大多数对象都有一个可用于设置接线的接口或基类。
对于模拟.NET Framework,您可以尝试Pex & Moles。它应该能够这样做,或者我被告知。我自己没用过,但它看起来很整洁!
答案 4 :(得分:0)
有一些漂浮在周围。在大多数情况下,您只需要1或2个配置值,然后就可以非常有效地计算路径。值#1是Web应用程序的根目录 - 从那里您可以轻松地构建任何资源的URL。值#2是Web应用程序的物理位置,如果在这种情况下实际上很重要。