2013-05-28 15 views
6

Mam interfejs, nazwijmy go ILocateLogFile, ze standardową implementacją dla serwerów dev/beta/production i taką, która działa tylko w lokalnym środowisku programistycznym. Wydaje mi się, że nie myślę o ładnym, czystym sposobie decydowania (najlepiej w czasie kompilacji, ale środowisko uruchomieniowe byłoby w porządku), jeśli pracuję lokalnie lub na serwerze. To jest aplikacja WCF hostowana na IIS, jeśli to ma znaczenie.Jak sprawdzić, czy kod jest uruchamiany lokalnie z Visual Studio/Cassini

Najlepszym Mam wymyślić jest użycie symbolu kompilatora, coś jak:

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

Problem jest, kompilowania symbole gotowi przez kompilacji, która nie kontrolować, a ja chcę być pewny. Czy nie istnieje jakiś automatyczny sposób sprawdzania obecności Visual Studio? Lub przynajmniej sprawdzić dla Cassini zamiast IIS?

+0

Widziałem to rozwiązać przed sprawdzając zmiennej nazwa serwera w razie else. – RandomUs1r

+1

Jakikolwiek powód, aby nie używać plików .config do konfigurowania rejestrowania? (prawdopodobnie masz już inny plik .config dla każdego środowiska, więc dodanie logowania może być banalne). –

+0

@ RandomUs1r to dobra sugestia, ale nie mogę użyć 'System.Web.HttpContext', ponieważ moja usługa WCF nie korzysta z kompatybilności ASP.Net ... – McGarnagle

Odpowiedz

8

Dwa sposoby Zrobiłem to 1 można sprawdzić nazwę procesu

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

lub zaktualizować plik konfiguracyjny z Custom Setting

<appSettings> 
    <add key="ApplicationEnvironment" value="LOCAL_DEV" /> 
</appSettings> 

zaktualizowanie specjalnie dla każdego środowiska i masz zapytanie aplikacji dla

Nie jestem pewien, czy istnieje sposób ustalenia tego podczas kompilacji, oprócz posiadania specjalnej konfiguracji kompilacji, która jest dla każdego środowiska i niestandardowe PRAGMA dla każdej z tych kompilacji. Osobiście uważam, że nie jest tak elegancko, ale może również działać.

+0

Dzięki, myślę, że pierwsza opcja jest dokładnie tym, czego szukam - chociaż moja nazwa procesu wydaje się być "WebDev.WebServer40" zamiast "iisexpress". – McGarnagle

+0

Ma to sens, jeśli używasz wbudowanego serwera programistycznego. Możesz pomyśleć o przejściu na IIS Express. Zauważyłem, że jest on bardziej odporny i jest wbudowany w VS 2012/2010 SP1. – jstromwick

-2

Oto kod użyłem

If Debugger.IsAttached Then 
' Since there is a debugger attached, 
' assume we are running from the IDE 
Else 
' Assume we aren't running from the IDE 
End If