2011-11-18 53 views
0

目前我有一個程序集用於Windows UI應用程序,它獲得了大量的內置邏輯和錯誤,它顯示消息給用戶使用ShowError( )內部使用Messagebox.Show(..)並將錯誤記錄到日誌文件/數據庫的方法。如何找到程序集用於Windows應用程序或Windows服務

這是我的問題。我想爲Windows服務使用相同的程序集。但是當我在Windows服務中使用這個程序集時,它會在Messagebox.show(..)上崩潰,因爲windows服務將不允許在正常模式下進行UI交互(我知道「允許服務與桌面交互」選項,但它不是對我來說是一個選擇)。

所以我想要做的就是做這樣的事情。如果正在使用Windows服務大會和虛假如果使用Windows應用程序

if(!IsWindowsService()) MessageBox.Show("Message"); Logger.Log("Message");

這裏IsWindowsService()應返回true。

任何想法如何得到這個?

+0

也許你可以添加一個構造函數重載,它接受一個指定與UI交互的參數是可能的? – Reddog

回答

0

我見過的所有解決方案基本上都會欺騙並檢查傳入執行程序集的命令行參數。 Environment.UserInteractive被認爲是不可靠的,你可以與WMI混淆,看看你期望的服務是否在運行,並且進程ID是有意義的,但是對於一個iffy測試來說這是很多工作。 這個參數也可以使兩個場景的去除污漬和單元測試變得更容易。

0

解決這類問題的一種方法是抽象消息(和日誌記錄等),然後使用Inversion Of Control容器通過引導程序爲它們配置適當的類。對於Windows服務,您的消息傳遞類可能不會執行任何操作,只需按照null object pattern

我已經使用了Autofac幾個項目,一旦你圍繞DI/IoC打包,它是一個強大的工具。

有一個學習曲線和一些額外的代碼來編寫,但關注的清晰分離應該使您的應用程序更易於維護和擴展。您還可以避免讓您的代碼受到許多基於其運行環境的條件語句的污染。

相關問題