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