Castle.MicroKernel.ComponentNotFoundException - 单元测试时

时间:2016-02-23 16:40:36

标签: inversion-of-control castle-windsor ioc-container castle

我正在尝试对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的新手我不明白缺少什么。代码修复会很好,但我真的很想知道为什么容器似乎没有注册orchestrator。

1 个答案:

答案 0 :(得分:2)

好的,所以缺少3件事

  1. 对Castle.Windsor.Installer
  2. 的引用
  3. 从容器到安装程序的调用,以“查找”所有已注册的类。
  4. 安装程序还需要添加子解析程序来创建类的集合,因为未注册特定集合,并且协调器需要集合IApiWrap。
  5. 安装程序更改

    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>();
    

    现在它可行,但是对代码正在做什么的任何进一步解释或更正都是受欢迎的。