當前位置: 妍妍網 > 碼農

巧用Environment.UserInteractive 實作開發和生產環境的分開偵錯部署

2024-05-15碼農

概述

平常我們在做服務開發的時候,經常是希望本地可以直接偵錯;在生產環境是以服務允許的;這時候,一般的做法寫2段程式碼,需要什麽環境就註釋那段程式碼,這樣很麻煩,這時候就可以利用Environment判斷當前的環境。C#中獲取系統環境變量需要用到Environment 類。其中提供了有關當前環境和平台的資訊以及操作它們的方法。該類不能被繼承,以下程式碼得到%systemdrive%的值,即「C:」

string sPath = Environment.GetEnvironmentVariable("systemdrive");
Console.WriteLine(sPath);

獲取一個值,用以指示當前行程是否在使用者互動模式中執行。

public static bool UserInteractive { get; }

如果當前行程在使用者互動模式中執行,則為true ;否則為 false。

註解

此UserInteractive 內容報告 false 的 Windows 行程或服務(如 IIS)在沒有使用者介面的情況下執行。如果此內容為 false ,則不會顯示模式對話方塊或訊息方塊,因為沒有可供使用者與之互動的圖形化使用者介面。

Program範例

internal static class Program
{
/// <summary>
/// 應用程式的主要進入點。
/// </summary>
private static void Main(string[] args)
{
args = new string[1];
args[0] = "WeChat.SendTemplateMsgJob";
bool isReleaseUpdateJob = Environment.UserInteractive // 上線更新舊資料,都只會手動執行一次
&& args.Length >= 1
&& args[0].StartsWith("ReleaseUpdate");
//Autofac
AutofacConfig.Bootstrapper();
if (Environment.UserInteractive)
{
if (args.Length == 0)
{
//Console 開啟
MainService mainService = new MainService();
mainService.TestStartAndStop(args);
}
else
{
//指定想要測試的 job
#region set Culture en-US
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
#endregion set Culture en-US
if (isReleaseUpdateJob)
{
string jobType = $"BigCRM.WinService.Jobs.{args[0]}";
ReleaseUpdateJob job = Activator.CreateInstance(Assembly.GetExecutingAssembly().FullName, jobType).Unwrap() as ReleaseUpdateJob;
job.Call(null, args);
}
else
{
#region load config
List<JobConfigItem> jobConfigItems = JobConfigItem.Get();
JobConfigItem config = jobConfigItems.FirstOrDefault(m => m.JobType == args[0]);
#endregion load config
#region init job
string jobType = $"BigCRM.WinService.Jobs.{config.JobType}";
BaseJob job = Activator.CreateInstance(Assembly.GetExecutingAssembly().FullName, jobType).Unwrap() as BaseJob;
job.CronSchedule = config.CronExpression;
job.JobType = config.JobType;
job.BaseSettings = config.Settings;
if (config.Settings != null)
{
job.Settings = new Quartz.JobDataMap(config.Settings);
}
#endregion init job
job.Call(null, args);
}
Console.ReadLine();
}
}
else
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new MainService()
};
ServiceBase.Run(ServicesToRun);
}
}
}