我有一个接口(interface),我们称其为ILocateLogFile,它具有针对dev/beta/production服务器的标准实现,并且仅在本地开发环境中有效。我似乎无法想到一种确定(如果最好是在编译时,但运行时会很好)是在本地还是在服务器上运行的干净方法。这很重要,它是IIS上托管的WCF应用程序。

我想出的最好方法是使用编译器符号,例如:

    ILocateLogFile locateLogFile;
#if DEBUG
    locateLogFile = new DevSandboxLogFileLocator();
#else
    locateLogFile = new LogFileLocator();
#endif

问题是,编译符号由build设置,我无法控制,并且我想确定。是否有某种自动的方法来检查Visual Studio的存在?还是至少要检查Cassini而不是IIS?

最佳答案

我执行此操作的两种方法1您可以检查进程名称

bool isRunningInIisExpress = Process.GetCurrentProcess()
                                .ProcessName.ToLower().Contains("iisexpress");

或使用自定义设置更新您的配置文件
<appSettings>
    <add key="ApplicationEnvironment" value="LOCAL_DEV" />
</appSettings>

您专门针对每种环境进行更新,并让您的应用程序查询以下内容:

我不确定是否有一种方法可以在编译时确定这一点,除了具有针对每个环境的特殊构建配置并为每个构建都放置自定义PRAGMA之外。我个人认为这不那么优雅,但也可以使用。

10-06 05:35