我有一个接口,让我们称之为ILocateLogFile
,使用dev / beta / production服务器的标准实现,以及仅在本地开发环境中工作的接口。如果我在本地或在服务器上运行,我似乎无法想出一个很好的干净方式来决定(最好是在编译时,但运行时会没问题)。如果这很重要,这是在IIS上托管的WCF应用程序。
我提出的最好的方法是使用编译器符号,例如:
ILocateLogFile locateLogFile;
#if DEBUG
locateLogFile = new DevSandboxLogFileLocator();
#else
locateLogFile = new LogFileLocator();
#endif
问题是,编译符号是由构建设置的,我无法控制,我想确定。是否有一些自动方法来检查Visual Studio的存在?或者至少检查一下Cassini而不是IIS?
答案 0 :(得分:8)
我完成此操作的两种方法1您可以检查进程名称
bool isRunningInIisExpress = Process.GetCurrentProcess()
.ProcessName.ToLower().Contains("iisexpress");
或使用自定义设置更新配置文件
<appSettings>
<add key="ApplicationEnvironment" value="LOCAL_DEV" />
</appSettings>
您专门针对每个环境进行更新,并为您提供
的应用程序查询我不确定是否有一种方法可以在编译时确定这一点,除了为每个环境提供特殊的构建配置并为每个构建放置一个自定义PRAGMA
。我个人认为这不是那么优雅,但它也可以起作用。
答案 1 :(得分:0)
我在这里找到了它,对我有用 Determine if ASP.NET application is running locally
bool isLocal = HttpContext.Current.Request.IsLocal;
答案 2 :(得分:-2)
这是我使用的代码
var initializationDeferred = Q.defer(); // Create here the deferred object so it's common to all init() invocations
var initializationStarted = false;
var init = function() {
if (!initializationStarted) {
initializationStarted = true;
setTimeout(function() {
// initialized
console.log('Init timeout fired!');
initializationDeferred.resolve(true); // Resolve the promise associated to the deferred object
}, 1000);
}
return initializationDeferred.promise; // Return the promise associated to the deferred object
};
var execute = function() {
return init().then(function(initialized) {
// Here your module is initialized and you can do whatever you want
// The value of "initialized" here is always "true"
console.log('Execute: initialized?', initialized);
});
};
execute().then(function() {
// This is executed
console.log('Execute First invocation');
});
execute().then(function() {
// This is executed too
console.log('Execute Second invocation');
});