Castle.MicroKernel.ComponentNotFoundException - 使用 Resolve<T> 解析组件时
Castle.MicroKernel.ComponentNotFoundException - when resolving components with Resolve<T>
我在手动解析容器中的对象时遇到问题。似乎 Windsor 没有找到合适的组件,即使组件的注册没有问题。具体到我的情况是,某些组件可以正常解析,而其他组件会抛出异常。值得注意的是构造函数依赖注入有效,即使有我无法手动解决的依赖。
当 运行:
时抛出
Castle.MicroKernel.ComponentNotFoundException
HResult=0x80131500
Message=No component for supporting the service Finance.Events.EventConductor.LoginConductor was found
Source=Castle.Windsor
StackTrace:
at Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve(Type service, IDictionary arguments, IReleasePolicy policy, Boolean ignoreParentContext)
at Castle.MicroKernel.DefaultKernel.Resolve(Type service, IDictionary arguments)
at Castle.Windsor.WindsorContainer.ResolveT
at Finance.Framework.Bootstrapper.OnStartup(Object sender, StartupEventArgs e) in C:\Users\User\source\repos\Project\Project\Framework\Bootstrapper.cs:line 39
at System.Windows.Application.OnStartup(StartupEventArgs e)
at System.Windows.Application.<.ctor>b__1_0(Object unused)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
代码:
protected override void Configure()
{
_windowManager = new WindowManager();
_container = new WindsorContainer();
_container.AddFacility<TypedFactoryFacility>();
_container.Install(new ShellInstaller(),
new FrameworkInstaller(),
new ViewModelInstaller(),
new ModelInstaller(),
new FactoryInstaller(),
new RepositoryInstaller(),
new NHibernateInstaller());
}
每个安装程序都像这样一一注册组件:
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<IEventAggregator>().ImplementedBy<EventAggregator>().LifestyleSingleton());
container.Register(Component.For<ILoginConductor>().ImplementedBy<LoginConductor>().LifestyleTransient());
container.Register(Component.For<IWindowManager>().ImplementedBy<WindowManager>().LifestyleSingleton());
container.Register(Component.For<ILoginService>().ImplementedBy<MockLoginService>().LifestyleSingleton());
}
我正在尝试这样解析我的对象。请注意,传递 LoginViewModel
到 windowManager 工作,而前面的行抛出异常。
protected override void OnStartup(object sender, StartupEventArgs e)
{
_loginConductor = _container.Resolve<LoginConductor>(); // this throws the exception.
_windowManager.ShowWindow(_container.Resolve<LoginViewModel>()); // this does not.
}
非常感谢任何帮助。
您看到错误是因为您尝试为 LoginConductor
解析 服务,但没有注册 服务 对于 LoginConductor
.
您正在为服务ILoginConductor
注册一个组件,由LoginConductor
实现。
如果上面的内容听起来很混乱,并且斜体字不清楚,there's a good primer in the documentation about it。
除此之外,解决方案是将您解决的 service 与 [=25] 的 service 对齐=]依赖性。是保留 ILoginConductor
作为服务还是将 LoginConductor
作为您的服务取决于您的具体情况。
我假设您已经解决了您的问题 - 但是,如果它对其他人有帮助:
将 OnStartup
方法的 _loginConductor
部分更改为读取 _loginConductor = _container.Resolve<ILoginConductor>();
(注意接口使用)应该可行,因为 ILoginConductor
是被注册为服务。当我遇到类似问题时为我工作。
我在手动解析容器中的对象时遇到问题。似乎 Windsor 没有找到合适的组件,即使组件的注册没有问题。具体到我的情况是,某些组件可以正常解析,而其他组件会抛出异常。值得注意的是构造函数依赖注入有效,即使有我无法手动解决的依赖。
当 运行:
时抛出Castle.MicroKernel.ComponentNotFoundException HResult=0x80131500 Message=No component for supporting the service Finance.Events.EventConductor.LoginConductor was found Source=Castle.Windsor StackTrace: at Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve(Type service, IDictionary arguments, IReleasePolicy policy, Boolean ignoreParentContext) at Castle.MicroKernel.DefaultKernel.Resolve(Type service, IDictionary arguments) at Castle.Windsor.WindsorContainer.ResolveT at Finance.Framework.Bootstrapper.OnStartup(Object sender, StartupEventArgs e) in C:\Users\User\source\repos\Project\Project\Framework\Bootstrapper.cs:line 39 at System.Windows.Application.OnStartup(StartupEventArgs e) at System.Windows.Application.<.ctor>b__1_0(Object unused) at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
代码:
protected override void Configure()
{
_windowManager = new WindowManager();
_container = new WindsorContainer();
_container.AddFacility<TypedFactoryFacility>();
_container.Install(new ShellInstaller(),
new FrameworkInstaller(),
new ViewModelInstaller(),
new ModelInstaller(),
new FactoryInstaller(),
new RepositoryInstaller(),
new NHibernateInstaller());
}
每个安装程序都像这样一一注册组件:
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<IEventAggregator>().ImplementedBy<EventAggregator>().LifestyleSingleton());
container.Register(Component.For<ILoginConductor>().ImplementedBy<LoginConductor>().LifestyleTransient());
container.Register(Component.For<IWindowManager>().ImplementedBy<WindowManager>().LifestyleSingleton());
container.Register(Component.For<ILoginService>().ImplementedBy<MockLoginService>().LifestyleSingleton());
}
我正在尝试这样解析我的对象。请注意,传递 LoginViewModel 到 windowManager 工作,而前面的行抛出异常。
protected override void OnStartup(object sender, StartupEventArgs e)
{
_loginConductor = _container.Resolve<LoginConductor>(); // this throws the exception.
_windowManager.ShowWindow(_container.Resolve<LoginViewModel>()); // this does not.
}
非常感谢任何帮助。
您看到错误是因为您尝试为 LoginConductor
解析 服务,但没有注册 服务 对于 LoginConductor
.
您正在为服务ILoginConductor
注册一个组件,由LoginConductor
实现。
如果上面的内容听起来很混乱,并且斜体字不清楚,there's a good primer in the documentation about it。
除此之外,解决方案是将您解决的 service 与 [=25] 的 service 对齐=]依赖性。是保留 ILoginConductor
作为服务还是将 LoginConductor
作为您的服务取决于您的具体情况。
我假设您已经解决了您的问题 - 但是,如果它对其他人有帮助:
将 OnStartup
方法的 _loginConductor
部分更改为读取 _loginConductor = _container.Resolve<ILoginConductor>();
(注意接口使用)应该可行,因为 ILoginConductor
是被注册为服务。当我遇到类似问题时为我工作。