inversion-of-control - CaSTLe.MicroKernel.ComponentNotFoundException - 单元测试时

标签 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 位于正在测试的项目中,但引用了命名空间,我可以新建一个 Orchestrator。我希望它只给我所有已注册 IApiWrap 的数组。

作为 CaSTLe 新手,我不明白缺少什么。代码修复会很好,但我真的很想知道为什么容器似乎没有注册编排器。

最佳答案

好的,所以缺少 3 件事

  1. 对 CaSTLe.Windsor.Installer 的引用
  2. 从容器到安装程序的调用,以“查找”所有已注册的类。
  3. 安装程序还需要添加子解析器来创建类集合,因为未注册特定集合,并且编排器需要 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>();

现在它可以工作了,尽管欢迎对代码的作用进行任何进一步的解释或更正。

关于inversion-of-control - CaSTLe.MicroKernel.ComponentNotFoundException - 单元测试时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35583153/

相关文章:

asp.net-mvc - CaSTLe Windsor、Fluent Nhibernate 和 Automapping Isession 已关闭问题

c# - Autofac:在一个组合后面隐藏多个逆变实现

php - Laravel:区别 App::bind 和 App::singleton

c# - 覆盖为嵌套/传递依赖项注入(inject)的组件实现

设备通信器的 TDD

spring - Spring 有没有像温莎城堡那样的@predestroy

java - 如何使用 Google Guice 绑定(bind)不同的接口(interface)?

command - 温莎城堡/DI 和对象模型

c# - IoC/DI面对winforms等生成代码

java - 在类 * 中找不到属性 * 的 setter