我创建了一个WebApi项目并将Castle Windsor配置为DI容器。Castle Windsor无法解析WebApi中的类型
当我在我的WebServer上部署WebApi时,一切正常,直到通过单击重新启动按钮或执行iisreset
命令重新启动Web服务器(我正在使用IIS
)。在那之后,我总是有以下错误:
No component for supporting the service XXX.ICategoryDomainService was found
当我运行在调试模式下项目中Visual Studio
,这个问题似乎随机发生。但是每次我做完整的Clean/Rebuild
之后,它至少会工作一次。停止/多次启动项目(始终在Visual Studio
之内)将问题带回。当异常升高时,我检查了集装箱的状态,一切似乎是确定
更新:
好吧,我终于设法找到问题了(但我目前没有适当的解决方案)。
我在自动扫描所有类型的我目前的项目,并试图然后注册的某些类型的框架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());
一个小的扩展方法(总是框架)
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'的注册。 –