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 是被注册为服务。当我遇到类似问题时为我工作。