很多時候都在討論是否需要了解一個組件或者一個語言的底層原理這個問題,其實我個人覺得,對于這個問題,每個人都有自己的看法,個人情況不同,選擇的方式也就會不同了。我個人覺得無論學習什么,都應該嘗試著去了解對應的原理和源碼(這里就不要急著吐槽,容我說完)。對底層的了解不是為了讓你寫出類似的東西,讓你寫也不可能寫的出來,重寫一個就需要以此修改整個底層結構,了解底層知識只是為了讓你可以在寫業(yè)務代碼時,選擇合適的方式,以此使底層與業(yè)務層配合達到效率最佳。任何一種方式有壞有好,需要合適的選擇。
如果覺得樓主以上的說法不對,或者有些不妥,還望見諒,因為爭論一個觀點沒有意義,認為對的人自己會去理解,認為不對的,可以忽略。沒有這個必要去花費時間和精力取討論這種事情。
以上是扯淡,下面切入正題。前面介紹了一個組件Hangfire,用于設置定時任務等等操作,在這里介紹另一款組件Topshelf。
一.Topshelf組件概述
Topshelf是.NET平臺的Windows服務框架。Topshelf可以輕松創(chuàng)建Windows服務,測試服務,調試服務,并最終將其安裝到Windows服務控制管理器(SCM)中。Topshelf通過允許開發(fā)人員專注于服務邏輯,而不是與.NET框架中的內置服務支持交互的細節(jié)。開發(fā)人員不需要了解服務類的復雜細節(jié),通過InstallUtil執(zhí)行安裝,或者了解如何將調試器附加到服務以進行故障排除問題。
創(chuàng)建Windows服務與創(chuàng)建控制臺應用程序類似,控制臺應用程序創(chuàng)建后,創(chuàng)建一個具有公共Start和Stop方法的單一服務類。服務操作的方式較多,自動,自動(延遲),手動和禁用啟動選項本地系統(tǒng),本地服務,網(wǎng)絡服務,用戶名/密碼或安裝期間提示的服務憑證。服務啟動依賴項,包括SQL Server,MSMQ和其他具有不同服務名稱的多實例服務安裝服務恢復選項,包括重新啟動,重新引導或運行程序。Topshelf與Mono合作,可以將服務部署到Linux。服務安裝功能目前僅限Windows。
二.Topshelf用法說明
介紹完對應的組件背景概述,在這里就要介紹一下如何使用這個組件的使用方法。該組件的使用方法有另個方法,都在HostFactory類中,下面具體的介紹一個使用方式。
1.配置新的服務主機
HostFactory.New(x => { // 可以定義不需要接口依賴性的服務,這只是為了 //在此示例中顯示并未使用。 x.Service<SampleSansInterfaceService>(s => { s.ConstructUsing(() => new SampleSansInterfaceService()); s.WhenStarted(v => v.Start()); s.WhenStopped(v => v.Stop()); }); });
2.配置和運行新的服務主機,處理任何異常并將其寫入日志
HostFactory.Run(x => { x.UseLog4Net("log4net.config"); x.UseAssemblyInfoForServiceInfo(); bool throwOnStart = false; bool throwOnStop = false; bool throwUnhandled = false; x.Service(settings => new SampleService(throwOnStart, throwOnStop, throwUnhandled), s => { s.BeforeStartingService(_ => Console.WriteLine("BeforeStart")); s.BeforeStoppingService(_ => Console.WriteLine("BeforeStop")); }); x.SetStartTimeout(TimeSpan.FromSeconds(10)); x.SetStopTimeout(TimeSpan.FromSeconds(10)); x.EnableServiceRecovery(r => { r.RestartService(3); r.RunProgram(7, "ping google.com"); r.RestartComputer(5, "message"); r.OnCrashOnly(); r.SetResetPeriod(2); }); x.AddCommandLineSwitch("throwonstart", v => throwOnStart = v); x.AddCommandLineSwitch("throwonstop", v => throwOnStop = v); x.AddCommandLineSwitch("throwunhandled", v => throwUnhandled = v); x.OnException((exception) => { Console.WriteLine("Exception thrown - " + exception.Message); }); });
3.Topshelf配置操作方法
三.Topshelf核心對象解析
承接上文,介紹完畢相關背景和常規(guī)操作,在這里介紹一個核心對象的一些方法。
1.HostFactory.New():
public static Host New(Action<HostConfigurator> configureCallback) { try { if (configureCallback == null) throw new ArgumentNullException("configureCallback"); var configurator = new HostConfiguratorImpl(); Type declaringType = configureCallback.Method.DeclaringType; if (declaringType != null) { string defaultServiceName = declaringType.Namespace; if (!string.IsNullOrEmpty(defaultServiceName)) configurator.SetServiceName(defaultServiceName); } configureCallback(configurator); configurator.ApplyCommandLine(); ConfigurationResult result = ValidateConfigurationResult.CompileResults(configurator.Validate()); if (result.Message.Length > 0) { HostLogger.Get(typeof(HostFactory)) .InfoFormat("Configuration Result:/n{0}", result.Message); } return configurator.CreateHost(); } catch (Exception ex) { HostLogger.Get(typeof(HostFactory)).Error("An exception occurred creating the host", ex); HostLogger.Shutdown(); throw; } }
該方法用于配置新的服務主機,方法接受一個參數(shù)Action<HostConfigurator>配置方法調用,該方法返回Host對象,表示Topshelf服務主機,準備運行。 configureCallback.Method.DeclaringType;用于獲取聲明該成員的類。declaringType.Namespace;用于獲取獲取 System.Type 的命名空間。ValidateConfigurationResult.CompileResults(configurator.Validate());用于驗證配置結果。
2.HostFactory.Run():
public static TopshelfExitCode Run(Action<HostConfigurator> configureCallback) { try { return New(configureCallback) .Run(); } catch (Exception ex) { HostLogger.Get(typeof(HostFactory)) .Error("The service terminated abnormally", ex); HostLogger.Shutdown(); return TopshelfExitCode.AbnormalExit; } }
該方法是一個靜態(tài)方法,配置和運行新的服務主機,處理任何異常并將其寫入日志。該方法接收一個參數(shù)Action<HostConfigurator> configureCallback配置方法調用,返回應用程序主方法返回的進程的退出代碼。
四.總結
以上是介紹如何使用Topshelf組件創(chuàng)建簡單的Windows服務的方法,在這里只是一個簡單的介紹,沒有很深入的介紹,如果需要了解更多的東西,可以看源碼,畢竟是開源免費的組件,也是一個很不錯的組件。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網(wǎng)。
新聞熱點
疑難解答
圖片精選