启动Windows服务时出错

时间:2012-06-13 11:26:58

标签: .net c#-4.0 windows-services unity-container

我有一个使用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();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

这与明确地成为Windows服务无关,这是因为你没有设置你的IoC,以便当Unity在你的构造函数中被要求提供某个实例时,Unity知道要注入什么。

据推测,你的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调用应返回的内容。为此,您需要在执行任何RegisterType之前设置对Resolve的调用,例如:

_container.RegisterType<Services.Engine.AuctionControl, Services.Engine.AuctionControl>();
在这种情况下,

是无意义的,因为Services.Engine.AuctionControl总是解析为自己。 (RegisterType<WhenAskedForThisType, GiveMeThisType>();)。