1

Я создал проект WebApi и сконфигурировал замок Виндзор как контейнер DI.Замок Виндзор не может разрешить тип в WebApi

Когда я развертываю свой WebApi на своем WebServer, все работает нормально, пока я не перезапущу веб-сервер (я использую IIS), нажав кнопку перезапуска или выполнив команду iisreset. После этого у меня всегда есть следующее сообщение об ошибке:

No component for supporting the service XXX.ICategoryDomainService was found

Когда работает мой проект в режиме отладки внутри Visual Studio, эта проблема, кажется, происходит случайным образом. Но каждый раз, когда я делаю полный Clean/Rebuild, он работает хотя бы один раз. Остановка/запуск проекта много раз (всегда внутри Visual Studio) возвращает проблему. Когда исключение поднят, я проверил состояние контейнера и кажется, что все будет хорошо

Castle Windsor Configuration

Update:

Хорошо, я наконец-то удалось найти, где эта проблема (но я на данный момент нет правильного решения).
Я делаю регистрацию в Framework DLL, который сканирует все типы моего текущего проекта и пытается затем автоматически регистрируются некоторые из этих типов ...

В Рамочной библиотеке:

IEnumerable<IInstaller> installers = this.Container.ResolveAll<IInstaller>(); 
foreach (IInstaller installer in installers) 
{ 
    installer.Install(this.Container); 
} 

Это как IInstaller зарегистрировано:

this.Container.Register(Classes 
    .From(ApplicationDomain.Current.ConcreteClasses) 
    .BasedOn<IInstaller>() 
    .WithServiceAllInterfaces() 
    .LifestylePerWebRequest()); 

небольшой метод расширения (всегда в Framework)

public static void RegisterAllServices(this IWindsorContainer container, 
    IEnumerable<Type> types) 
{ 
    container.Register(Classes 
     .From(types) 
     .BasedOn<IService>() 
     .WithServiceAllInterfaces() 
     .LifestyleTransient()); 
} 

Установщик в моем проекте

public class BusinessInstaller : IInstaller 
{ 
    public void Install(IWindsorContainer container) 
    { 
     Type[] types = typeof(BusinessInstaller).Assembly.GetTypes(); 
     container.RegisterAllServices(types); 
    } 
} 

Это очень weired, но это то, что я могу наблюдать: метод расширения RegisterAllServices вызывается только тогда, когда я перестраивает полностью. После этого, в режиме отладки, я вижу, что отладчик просто шагает по никогда не попадает в этот метод, НО типы регистрируются в любом случае (но, вероятно, неправильно, потому что Windsor не может их решить!).

Временное решение заключается в регистрации всех моих классов в BusinessInstaller. Тогда это работает ... но это не является оптимальным, было бы лучше, если бы все могло быть автоматически зарегистрировано ...

+0

Как выглядит ваша регистрация? И где был объединенный замок с 'IDependecyResolver'? –

+0

Просмотреть мое обновление ... – Bidou

+0

Я не вижу никакой особой вещи. Однако я прошу себя, если есть способ, который «Container.Current» может быть повторно инициализирован ... В моей предыдущей работе я был тем, кто настраивал замок с помощью «WebApi», я считаю, что что-то не хватает ... Мне нужно найти мой POC, когда я его найду, я его загружу ... Еще одна вещь, я думаю, вы должны загрузить регистрацию «ICategoryDomainService». –

ответ

1

Я думаю, ваша проблема заключается в линии ApplicationDomain.Current.ConcreteClasses

В кратких видах извлекая из Домен приложения не является надежным, если сборки проверяются, но не используются в коде. Therefor исправление будет ввести в явном виде ссылки на сборку, содержащую установки в вашем коде boostrap как:

var t = typeof(BusinessInstaller).Assembly 

Смотрите эту post для подобной проблемы.

+0

Holy дерьмо! Я искал столько часов, что проблема ... Я не понимаю, почему явное исключение не возникает ... Спасибо! – Bidou

Смежные вопросы