Castle.MicroKernel.ComponentNotFoundException-使用Resolve <t>

时间:2018-10-30 12:57:43

标签: c# castle-windsor

我无法从容器中手动解析对象。即使组件的注册顺利进行,温莎似乎也没有找到合适的组件。我的情况具体是某些组件可以很好地解决,而其他组件则抛出异常。值得注意的是,即使存在我无法手动解决的依赖关系,构造函数依赖关系注入也能正常工作。

运行时会抛出:

  

Castle.MicroKernel.ComponentNotFoundException     HResult = 0x80131500     消息=找不到支持服务Finance.Events.EventConductor.LoginConductor的组件     来源= Castle.Windsor     堆栈跟踪:      在Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve(类型服务,IDictionary自变量,IReleasePolicy策略,布尔ignoreParentContext)      在Castle.MicroKernel.DefaultKernel.Resolve(类型服务,IDictionary自变量)      在Castle.Windsor.WindsorContainer.ResolveT      在Finance.Framework.Bootstrapper.OnStartup(Object sender,StartupEventArgs e)中的C:\ Users \ User \ source \ repos \ Project \ Project \ Framework \ Bootstrapper.cs:line 39      在System.Windows.Application.OnStartup(StartupEventArgs e)      在System.Windows.Application。<。ctor> b__1_0(未使用对象)      在System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托回调,对象args,Int32 numArgs)      在System.Windows.Threading.ExceptionWrapper.TryCatchWhen(对象源,委托回调,对象args,Int32 numArgs,委托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.
}

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您看到此错误,因为您正在尝试为node test.js解决服务,但没有为{{1}注册一个服务 }。

您正在为LoginConductor实现的服务 LoginConductor注册组件

如果以上听起来令人困惑,并且斜体字不清楚,请there's a good primer in the documentation about it

通过这种方式,解决方案将使您解析的服务与您的依赖项 service 保持一致。是将ILoginConductor保留为服务,还是将LoginConductor保留为服务,取决于您的特定上下文。