首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Castle.MicroKernel.ComponentNotFoundException -当使用Resolve<T>解析组件时

Castle.MicroKernel.ComponentNotFoundException -当使用Resolve<T>解析组件时
EN

Stack Overflow用户
提问于 2018-10-30 12:57:42
回答 2查看 3K关注 0票数 1

我很难手动解析容器中的对象。看起来温莎并没有找到合适的组件,即使这些组件的注册过程中没有问题。特定于我的情况,一些组件可以很好地解决问题,而另一些组件则抛出异常。值得注意的是,构造函数依赖注入工作,即使是依赖关系,我无法手动解决。

这将在运行时抛出:

在Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve(Type服务、IDictionary参数、IReleasePolicy策略、布尔ignoreParentContext的Castle.MicroKernel.DefaultKernel.Resolve(Type,IDictionary参数)的Castle.MicroKernel.DefaultKernel.Resolve(Type,IDictionary参数)的Castle.MicroKernel.DefaultKernel.Resolve(Type,IDictionary参数)的Castle.MicroKernel.DefaultKernel.Resolve(Type,IDictionary参数)处,找到了用于支持服务Finance.Events.EventConductor.LoginConductor的Castle.MicroKernel.ComponentNotFoundException HResult=0x80131500 Message=No组件: at Source=Castle.Windsor StackTrace: at IDictionary服务、IDictionary参数、IReleasePolicy策略、布尔ignoreParentContext(IDictionary参数)。在C:\Users\User\source\repos\Project\Project\Framework\Bootstrapper.cs:line 39 at System.Windows.Application.OnStartup(StartupEventArgs e) ( System.Windows.Application.<.ctor>b__1_0(Object未使用)在System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate回调,Object args,Int32 numArgs(在System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object源),委托回调,对象args,Int32 numArgs,代表catchHandler)

“守则”:

代码语言:javascript
复制
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());
}

每个安装程序逐一注册组件,如下所示:

代码语言:javascript
复制
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是有效的。

代码语言:javascript
复制
protected override void OnStartup(object sender, StartupEventArgs e)
{
    _loginConductor = _container.Resolve<LoginConductor>(); // this throws the exception.
    _windowManager.ShowWindow(_container.Resolve<LoginViewModel>()); // this does not.
}

任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-30 15:06:47

您看到了错误,因为您试图解析LoginConductor的服务,但没有为LoginConductor注册服务。

您正在为由ILoginConductor实现的服务LoginConductor注册一个组件。

如果上面的话听起来很混乱,而斜体字不清楚的话,在有关它的文档中有一个很好的入门

这样,解决方案将是将您解析的服务与您的依赖关系的服务对齐。您是将ILoginConductor保留为服务,还是使LoginConductor成为您的服务取决于您的特定上下文。

票数 2
EN

Stack Overflow用户

发布于 2021-10-01 11:46:48

我假设你已经解决了你的问题--不过,如果它能帮到别人的话:

OnStartup方法的OnStartup部分更改为读取_loginConductor = _container.Resolve<ILoginConductor>(); (注意接口使用)应该有效,因为ILoginConductor是注册为服务的部分。当我遇到类似的问题时为我工作过。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53064843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档