Castle.MicroKernel.ComponentNotFoundException - 单元测试时
Castle.MicroKernel.ComponentNotFoundException - When Unit Testing
我正在尝试对 Orchestrator 进行单元测试。
//Arrange
var containter = new WindsorContainer();
var Orch = containter.Resolve<ApiOrchestrator>();// Exception Thrown here
Orchestrator 的构造函数是:
public ApiOrchestrator(IApiWrap[] apiWraps)
{
_apiWraps = apiWraps;
}
注册是
public class IocContainer : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<FrmDataEntry>().LifestyleTransient());
container.Register(Component.For<ApiOrchestrator>().LifestyleTransient());
container.Register(Component.For<IApiWrap>().ImplementedBy<ClassA>().LifestyleTransient());
container.Register(Component.For<IApiWrap>().ImplementedBy<ClassB>().LifestyleTransient());
}
}
IocContainer 在正在测试的项目中,但命名空间被引用,我可以 new
启动 Orchestrator。我希望它只给我所有已注册 IApiWrap 的数组。
作为 Castle 的新手,我不明白缺少什么。代码修复会很好,但我真的很想知道为什么容器似乎没有注册编排器。
好的,所以缺少 3 个东西
- 参考 Castle.Windsor.Installer
- 从容器到安装程序的调用 'go look for' 所有已注册的 类。
- 安装程序还需要添加一个子解析器来生成 类 的集合,因为未注册特定的集合并且协调器需要 IApiWrap 的集合。
安装程序更改
public class IocContainer : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
//New Line
container.Kernel.Resolver.AddSubResolver(
new CollectionResolver(container.Kernel, true));
container.Register(Component.For<FrmDataEntry>().LifestyleTransient());
container.Register(Component.For<ApiOrchestrator>().LifestyleTransient());
container.Register(Component.For<IApiWrap>().ImplementedBy<SettledCurveImportCommodityPriceWrap>().LifestyleTransient());
container.Register(Component.For<IApiWrap>().ImplementedBy<ForwardCurveImportBalmoPriceWrap>().LifestyleTransient());
}
}
测试/解决变化
//Arrange
var container = new WindsorContainer();
//New Line
container.Install(FromAssembly.InDirectory(new AssemblyFilter("","EkaA*") ));
var Orch = container.Resolve<ApiOrchestrator>();
现在可以使用了,但欢迎对代码的作用进行任何进一步的解释或更正。
我正在尝试对 Orchestrator 进行单元测试。
//Arrange
var containter = new WindsorContainer();
var Orch = containter.Resolve<ApiOrchestrator>();// Exception Thrown here
Orchestrator 的构造函数是:
public ApiOrchestrator(IApiWrap[] apiWraps)
{
_apiWraps = apiWraps;
}
注册是
public class IocContainer : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<FrmDataEntry>().LifestyleTransient());
container.Register(Component.For<ApiOrchestrator>().LifestyleTransient());
container.Register(Component.For<IApiWrap>().ImplementedBy<ClassA>().LifestyleTransient());
container.Register(Component.For<IApiWrap>().ImplementedBy<ClassB>().LifestyleTransient());
}
}
IocContainer 在正在测试的项目中,但命名空间被引用,我可以 new
启动 Orchestrator。我希望它只给我所有已注册 IApiWrap 的数组。
作为 Castle 的新手,我不明白缺少什么。代码修复会很好,但我真的很想知道为什么容器似乎没有注册编排器。
好的,所以缺少 3 个东西
- 参考 Castle.Windsor.Installer
- 从容器到安装程序的调用 'go look for' 所有已注册的 类。
- 安装程序还需要添加一个子解析器来生成 类 的集合,因为未注册特定的集合并且协调器需要 IApiWrap 的集合。
安装程序更改
public class IocContainer : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
//New Line
container.Kernel.Resolver.AddSubResolver(
new CollectionResolver(container.Kernel, true));
container.Register(Component.For<FrmDataEntry>().LifestyleTransient());
container.Register(Component.For<ApiOrchestrator>().LifestyleTransient());
container.Register(Component.For<IApiWrap>().ImplementedBy<SettledCurveImportCommodityPriceWrap>().LifestyleTransient());
container.Register(Component.For<IApiWrap>().ImplementedBy<ForwardCurveImportBalmoPriceWrap>().LifestyleTransient());
}
}
测试/解决变化
//Arrange
var container = new WindsorContainer();
//New Line
container.Install(FromAssembly.InDirectory(new AssemblyFilter("","EkaA*") ));
var Orch = container.Resolve<ApiOrchestrator>();
现在可以使用了,但欢迎对代码的作用进行任何进一步的解释或更正。