我创建了一个WebApi项目,并将Castle Windsor配置为DI容器。
当我在WebServer上部署WebApi时,一切正常,直到我重新启动Web服务器(我使用IIS
),方法是单击重启按钮或执行iisreset
命令。之后,我总是有以下错误:
没有支持该服务的组件 XXX.ICategoryDomainService 被发现
在Visual Studio
内以调试模式运行我的项目时,这个问题似乎是随机发生的。但每次我做一个完整的Clean/Rebuild
,它至少会工作一次。多次停止/启动项目(总是在Visual Studio
内)会带来问题。当异常提出时,我检查了Container的状态,一切似乎都没问题
更新
好的,我终于设法找到问题所在(但我现在还没有适当的解决方案) 我在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);
}
}
它非常受欢迎,但这是我可以观察到的:扩展方法RegisterAllServices
仅在我进行完全重建时调用。之后,在调试模式下,我可以看到调试器只是跳过一个永远不会进入这个方法但是无论如何都要注册类型(但可能是错误的方式,因为Windsor无法解决它们!)。
临时修复是在BusinessInstaller中注册我的所有类。然后它可以工作......但它不是最优的,如果一切都可以自动注册会更好......
答案 0 :(得分:1)
我认为你的问题在于排除 ApplicationDomain.Current.ConcreteClasses
如果程序集被重新引用但未在代码中使用,那么简单地从Application Domain获取类型是不可靠的。因此,修复将显式引用包含安装程序的程序集,如boost:
var t = typeof(BusinessInstaller).Assembly
有关类似问题,请参阅此post。