此文歡迎轉載,原始連接地址:http://www.cnblogs.com/DjlNet/p/7603819.htmlhtml
原先也偶然見過這個關鍵詞,當時只是有個大體瞭解貌似和WinService開發有關係,此前在對Quartz.Net瞭解的時候再次接觸到TopShelf,這個時候博主就認爲不能一筆帶過了,此框架須要另起一篇小文對於它有一個稍微更加詳細的說明與實踐,看看當對於原生的winservice開發或許方便了許多在哪裏,那麼今天咱們就綜合園友的文章以及官方文檔的腳步學習一下吧......linux
這裏優先給出地址:https://github.com/topshelf/topshelf,同時這裏引用一下官方的描述:An easy service hosting framework for building Windows services using .NET。一個使用.NET可以簡單構建windows服務的自託管開發框架,且能夠在安裝了mono的linux上面運行也實現了必定程度上面的跨平臺,同時咱們看到star的數量超過2K,也說明了在這塊必定的受歡迎程度。它可以讓服務的建立被簡化,容許開發人員建立一個簡單的控制檯應用程序,能夠使用Topshelf做爲服務安裝。這樣一來調試控制檯應用程序比服務容易得多,也不用掛載進程調試了,並且一旦應用程序通過測試並能夠進行生產,Topshelf能夠輕鬆安裝應用程序做爲服務,幾行cmd命令都搞定了。接下來就按照文檔來講一說它,這裏博主仍是選取些以爲重要些的東西記錄....git
TopShelf至少得在.NET3.5SP1及其以上的環境中運行,它須要.NET環境運行時纔可以運行
下面的代碼來自與官方例子,其中較好的說明了使用方法以及經常使用配置說明:github
public class TownCrier { readonly Timer _timer; public TownCrier() { _timer = new Timer(1000) {AutoReset = true}; _timer.Elapsed += (sender, eventArgs) => Console.WriteLine("It is {0} and all is well", DateTime.Now); } public void Start() { _timer.Start(); } public void Stop() { _timer.Stop(); } } public class Program { public static void Main() { HostFactory.Run(x => { x.Service<TownCrier>(s => { s.ConstructUsing(name=> new TownCrier()); s.WhenStarted(tc => tc.Start()); s.WhenStopped(tc => tc.Stop()); }); x.RunAsLocalSystem(); x.SetDescription("Sample Topshelf Host"); x.SetDisplayName("Stuff"); x.SetServiceName("Stuff"); }); } }
大體從上面代碼就能夠看出一些使用方式和套路,同時咱們也發現了一個應用場景就是適合常駐任務進程,例如一些定時任務或者被動觸發類(消費消息隊列什麼的)的程序來做爲主要邏輯,正好就是場景應用比較好的體現。windows
服務配置方面,提供了兩種配置方式,不過道理都同樣,(1)將你的自定義邏輯實現接口ServiceControl
,而後在 HostFactory.New(x =>
添加便可,這種方式還能夠指定依賴項,固然也能夠依賴注入(2)框架
{ x.Service<MyService>(); });
HostFactory.New(x => { x.Service<MyService>(sc => { sc.ConstructUsing(() => new MyService()); // the start and stop methods for the service sc.WhenStarted(s => s.Start()); sc.WhenStopped(s => s.Stop()); // optional pause/continue methods if used sc.WhenPaused(s => s.Pause()); sc.WhenContinued(s => s.Continue()); // optional, when shutdown is supported sc.WhenShutdown(s => s.Shutdown()); }); });
這種自定義服務的方式適合零依賴,控制靈活推薦使用,固然愛怎麼注入與解析都提供了機會函數
服務啓動方式,這裏TopShelf提供了4種,其實也是winservice的那幾種方式了,這裏
x.StartAutomatically(); // Start the service automatically 自動啓動
x.StartAutomaticallyDelayed(); // Automatic (Delayed) -- only available on .NET 4.0 or later 自動延遲啓動
x.StartManually(); // Start the service manually 手動
x.Disabled(); // install the service as disabled 禁用學習
服務恢復:EnableServiceRecovery 主要配置項目以下:(具體能夠看API的描述便可)測試
HostFactory.New(x => { x.EnableServiceRecovery(r => { //you can have up to three of these r.RestartComputer(5, "message"); r.RestartService(0); //the last one will act for all subsequent failures r.RunProgram(7, "ping google.com"); //should this be true for crashed or non-zero exits r.OnCrashOnly(); //number of days until the error count resets r.SetResetPeriod(1); }); });
要配置服務恢復選項,配置程序可用於指定一個或多個服務恢復操做。恢復選項僅在安裝服務時使用,並在服務成功安裝後設置。恢復操做按照指定的順序執行,下一個操做在上一個操做運行後再執行,在服務失敗復甦時。存在能夠執行多少動做的限制(基於OS),一般是2-3動做。ui
服務運行身份標識:x.RunAs("username", "password"); x.RunAsPrompt(); x.RunAsNetworkService(); x.RunAsLocalSystem(); x.RunAsLocalService();
自定義服務安裝卸載行爲(注入委託):x.BeforeInstall(() => { ... }); x.AfterInstall(() => { ... }); x.BeforeUninstall(() => { ... }); x.AfterUninstall(() => { ... });
服務依賴:能夠指定服務依賴關係,以便在從屬服務啓動以前服務不會啓動。這由Windows服務控制管理器管理,而不是由Topshelf自己管理。x.DependsOn("SomeOtherService");
,這裏TopShelf框架內置了幾個經常使用的依賴性配置:
x.DependsOnMsmq(); // Microsoft Message Queueing
x.DependsOnMsSql(); // Microsoft SQL Server
x.DependsOnEventLog(); // Windows Event Log
x.DependsOnIis(); // Internet Information Server
高級配置: x.EnablePauseAndContinue();容許暫停和繼續,這裏考慮到某些任務具備如此需求場景,例如定時器等等; x.EnableShutdown(); 指定該服務支持shutdown服務命令,容許服務控制管理器快速關閉服務。
HostFactory.New(x => { x.OnException(ex => { // Do something with the exception }); });
爲服務運行時拋出的異常提供回調。這個回調函數不是處理程序,不會影響Topshelf已經提供的默認異常處理。旨在提供觸發外部操做,日誌等的拋出異常的可見性。
Logging Integration with Topshelf (日誌集成):默認狀況下,Topshelf使用TraceSource進行日誌記錄。這是.NET框架的一部分,所以不會引入任何額外的依賴關係。可是,許多應用程序使用更高級的日誌庫,例如Log4net或NLog。爲了支持這一點,Topshelf使用了可擴展的日誌界面。x.UseLog4Net();
利用Topshelf.Log4Net便可輕鬆集成,這將使HostLogger更改成使用log4net。有一個重載能夠指定一個配置文件。若是給定,文件名將被解析到ApplicationBase文件夾並傳遞給log4net以配置日誌追加器和級別;x.UseNLog();
依賴Topshelf.NLog,同理這將更改HostLogger以使用NLog,也能夠使用相同方法的重載來傳遞現有的LogFactory。
Topshelf Command-Line Reference(Topshelf命令行參考):這裏直接給出參考地址:https://topshelf.readthedocs.io/en/latest/overview/commandline.html,內容差很少很詳細了
其實總體來講,TopShelf已經封裝了挺優秀了,使用方便以及API的友好性方面都作得挺不錯,因此也值得咱們學習和研究,此文大體上基本也是對文檔內容作了一個大體摘錄和整理,要說有什麼乾貨也就這樣了,不過咱們由此得出學習或者研究一個新玩意,來的最直接就是閱讀官方文檔和一些參考實現。
http://www.cnblogs.com/pengze0902/p/6602737.html 使用Topshelf組件構建簡單的Windows服務,這裏順便引用一下地址博主的圖片做爲參考(圖片來源於上面地址):