1

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();
        }
    }
}
4

1 に答える 1

0

これは、明示的に Windows サービスであることとは関係ありません。コンストラクターで何かのインスタンスを要求されたときに、Unity が何を注入するかを認識できるように 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何を返すべきかを伝える必要があります。これを行うには、 -ingを実行する前に次のようなResolve呼び出しをセットアップする必要があります。RegisterTypeResolve

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

この場合、Services.Engine.AuctionControl常にそれ自体に解決されるため、これは無意味です。( RegisterType<WhenAskedForThisType, GiveMeThisType>();)。

于 2012-06-13T11:30:11.220 に答える