簡體   English   中英

啟動Windows服務時出錯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM