[英]Error starting a Windows Service
我有一個已使用installutil成功安裝的Windows服務,但是運行該服務時,我收到一條錯誤消息,指出該服務無法啟動,因為該服務未能及時響應。 在事件查看器中,我可以看到此錯誤。
Application: AuctionControl.Service.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: Microsoft.Practices.Unity.ResolutionFailedException
Stack:
at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(System.Type, System.Object, System.String, System.Collections.Generic.IEnumerable`1<Microsoft.Practices.Unity.ResolverOverride>)
at Microsoft.Practices.Unity.UnityContainer.Resolve(System.Type, System.String, Microsoft.Practices.Unity.ResolverOverride[])
at Microsoft.Practices.Unity.UnityContainerExtensions.Resolve[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]](Microsoft.Practices.Unity.IUnityContainer, Microsoft.Practices.Unity.ResolverOverride[])
at AuctionControl.Service.Service1..ctor()
at AuctionControl.Service.Program.Main()
我的代碼如下
using System.ServiceProcess;
using Microsoft.Practices.Unity;
namespace AuctionControl.Service
{
public partial class Service1 : ServiceBase
{
#region Constructor(s)
public Service1()
{
InitializeComponent();
_container = new UnityContainer();
_auctionControl = _container.Resolve<Services.Engine.AuctionControl>();
}
#endregion
#region Fields
private readonly Services.Engine.AuctionControl _auctionControl;
private readonly UnityContainer _container;
#endregion
protected override void OnStart(string[] args)
{
_auctionControl.StartAuctionControl();
}
protected override void OnStop()
{
_auctionControl.StopAuctionControl();
}
}
}
這與顯式地成為Windows Service無關,這是因為尚未設置IoC,以便Unity在請求構造函數中的某個實例時知道要注入什么。
AuctionControl.Service.Service1
您在AuctionControl.Service.Service1
構造函數中有一個接口,但是您沒有告訴Unity容器將綁定/解析該接口的具體類。
編輯:
您實際上需要Unity
嗎? 它似乎沒有做任何有用的事情。
嘗試:
public Service1()
{
InitializeComponent();
_auctionControl = new Services.Engine.AuctionControl();
}
這樣行嗎?
Unity應該允許您在運行時將接口(通常)綁定到具體類型,以使您能夠靈活地進行測試並減少組件的耦合。 您知道為什么這里的代碼中有一個Unity容器嗎?
這行:
_auctionControl = _container.Resolve<Services.Engine.AuctionControl>();
說:“我想要AuctionControl
的具體實例,但我不想要”,確切地確定編譯時是什么類型, Resolve
會在運行時弄清楚它是什么。 但是,為了使Unity
可以在您請求AuctionControl
時確定給您什么,您必須告訴它Resolve
調用應該返回什么。 為此,您需要在執行任何Resolve
之前設置對RegisterType
的調用,例如:
_container.RegisterType<Services.Engine.AuctionControl, Services.Engine.AuctionControl>();
在這種情況下,這毫無意義,因為Services.Engine.AuctionControl
始終會自行解析。 ( RegisterType<WhenAskedForThisType, GiveMeThisType>();
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.