ComponentNotFoundException Замок Виндзор

#c# #castle-windsor

#c# #замок-Виндзор

Вопрос:

Вот мой Installer.cs :

 class Installer : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container
            .Register(Component.For<IDbContext>()
            .ImplementedBy<ApplicationDbContext>()
            .LifeStyle.PerThread
            );

        container
            .Register(Component.For(typeof(IRepository<>))
            .ImplementedBy(typeof(Repository<>))
            .LifeStyle.PerThread
            );

        container
            .Register(Component.For<IServiceReadCity>()
            .ImplementedBy<ServiceReadCity>()
            .LifeStyle.PerThread
            );
    }
}
  

Вот моя Program.cs :

 SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
System.Data.Entity.SqlServer.SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types, Version=12.0.0.0, Culture=neutral, PublicKeyToken=898989899898989898";

var container = new WindsorContainer();

container.Install(FromAssembly.This());
IServiceReadCity _cityReadService = container.Resolve<IServiceReadCity>();

var cities = _cityReadService.GetListQuery();
  

Это консольное приложение. Я получаю это исключение :

{«Нет компонента для поддержки сервиса Reveal.Домен.Расположение.Сервис.Чтение.Найден IServiceReadCity»} В этой строке :

 IServiceReadCity _cityReadService = container.Resolve<IServiceReadCity>();
  

Можете ли вы сказать мне, что я делаю не так и как это исправить? Спасибо.

Комментарии:

1. Вы установили точку останова своего установщика, чтобы убедиться, что он действительно работает? Вы также можете проверить контейнер во время отладки, чтобы проверить, какие службы зарегистрированы и какие реализации поддерживают их.

2. @Charleh Я устанавливаю точку останова для установщика и вижу, что он не запускается. Как я могу заставить это работать? Спасибо.

3. Вероятно, вам нужно создать свой установщик public . Я бы предположил, что Windsor сканирует сборку на наличие общедоступных типов, реализующих IWindsorInstaller интерфейс. Вероятно, Windsor не запускает его, потому что не может его найти.

4. Вы правы. Общедоступность установщика решила проблему. Спасибо.

Ответ №1:

Установщики в Windsor должны быть общедоступными, поскольку Windsor ищет общедоступные типы, реализующие IWindsorInstaller интерфейс.

Создание установщика public должно устранить проблему