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 服务无关,这是因为您尚未设置 IoC,以便 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-ing 之前设置一个调用,例如:

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

在这种情况下,这是毫无意义的,因为它Services.Engine.AuctionControl总是会自行解决。( RegisterType<WhenAskedForThisType, GiveMeThisType>();)。

于 2012-06-13T11:30:11.220 回答