Я создал проект WebApi и сконфигурировал замок Виндзор как контейнер DI.Замок Виндзор не может разрешить тип в WebApi
Когда я развертываю свой WebApi на своем WebServer, все работает нормально, пока я не перезапущу веб-сервер (я использую IIS
), нажав кнопку перезапуска или выполнив команду iisreset
. После этого у меня всегда есть следующее сообщение об ошибке:
No component for supporting the service XXX.ICategoryDomainService was found
Когда работает мой проект в режиме отладки внутри Visual Studio
, эта проблема, кажется, происходит случайным образом. Но каждый раз, когда я делаю полный Clean/Rebuild
, он работает хотя бы один раз. Остановка/запуск проекта много раз (всегда внутри Visual Studio
) возвращает проблему. Когда исключение поднят, я проверил состояние контейнера и кажется, что все будет хорошо
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. Тогда это работает ... но это не является оптимальным, было бы лучше, если бы все могло быть автоматически зарегистрировано ...
Как выглядит ваша регистрация? И где был объединенный замок с 'IDependecyResolver'? –
Просмотреть мое обновление ... – Bidou
Я не вижу никакой особой вещи. Однако я прошу себя, если есть способ, который «Container.Current» может быть повторно инициализирован ... В моей предыдущей работе я был тем, кто настраивал замок с помощью «WebApi», я считаю, что что-то не хватает ... Мне нужно найти мой POC, когда я его найду, я его загружу ... Еще одна вещь, я думаю, вы должны загрузить регистрацию «ICategoryDomainService». –