Castle.MicroKernel.ComponentNotFoundException - при разрешении компонентов с помощью Resolve <T> - PullRequest
0 голосов
/ 30 октября 2018

У меня проблемы с разрешением объектов из моего контейнера вручную. Похоже, что Виндзор не находит подходящих компонентов, хотя регистрация компонентов проходит без проблем. Особенность моего случая заключается в том, что некоторые компоненты разрешаются нормально, а другие выдают исключение. Следует отметить, что внедрение зависимостей в конструктор работает, даже с зависимостями, которые я не мог разрешить вручную.

Выдается при запуске:

Castle.MicroKernel.ComponentNotFoundException HResult = 0x80131500 Сообщение = Нет компонента для поддержки службы Finance.Events.EventConductor.LoginConductor. Источник = Castle.Windsor Трассировки стека: at Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve (Служба типов, аргументы IDictionary, политика IReleasePolicy, логическое значение ignoreParentContext). at Castle.MicroKernel.DefaultKernel.Resolve (Служба типов, аргументы IDictionary) в Castle.Windsor.WindsorContainer.ResolveT в Finance.Framework.Bootstrapper.OnStartup (Отправитель объекта, StartupEventArgs e) в C: \ Users \ Пользователь \ source \ repos \ Project \ Project \ Framework \ Bootstrapper.cs: строка 39 в System.Windows.Application.OnStartup (StartupEventArgs e) в System.Windows.Application. <. ctor> b__1_0 (объект не используется) в System.Windows.Threading.ExceptionWrapper.InternalRealCall (обратный вызов делегата, аргументы объекта, Int32 numArgs) в System.Windows.Threading.ExceptionWrapper.TryCatchWhen (Источник объекта, Обратный вызов делегата, Аргументы объекта, 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 голосов
/ 30 октября 2018

Вы видите ошибку, потому что пытаетесь разрешить службу для LoginConductor, но не регистрируете службу для LoginConductor.

Вы регистрируете компонент для службы ILoginConductor, реализованной LoginConductor.

Если вышесказанное звучит запутанно, а выделенные курсивом слова не ясны, в документации есть хороший учебник об этом .

При этом решение будет состоять в том, чтобы настроить службу , которую вы разрешаете, с службой вашей зависимости . Сохраняете ли вы ILoginConductor в качестве службы или LoginConductor, ваша служба зависит от вашего конкретного контекста.

...