2012-06-13 124 views
1

我有一個使用installutil成功安裝的Windows服務,但是當我運行它時,出現錯誤,指出服務無法啓動,因爲它無法及時響應。在事件查看器中,我可以看到這個錯誤。啓動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(); 
     } 
    } 
} 
+0

你在做什麼'構造函數'和'StartService'? –

+0

可能有多種原因導致該錯誤。你嘗試過調試嗎? –

+0

這不是我的代碼,所以我還沒有看過它。我會嘗試並調試它。 –

回答

0

這不是作爲一個Windows服務明確地做,那是因爲你還沒有設置你的IoC,以便統一知道當它注入什麼在你的構造函數中請求一個實例。

大概你在你的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時要提供什麼,您必須告訴它0123B調用應返回的內容。

_container.RegisterType<Services.Engine.AuctionControl, Services.Engine.AuctionControl>(); 

是,在這種情況下,毫無意義的Services.Engine.AuctionControl始終解析自己:要做到這一點,你,你做任何Resolve -ing,像之前需要安裝到RegisterType通話。 (RegisterType<WhenAskedForThisType, GiveMeThisType>();)。

+0

我現在將發佈我的代碼。 –