过滤除当前组件之外的命名空间中的所有组件

时间:2016-11-15 15:29:03

标签: c# inversion-of-control castle-windsor

我在我的解决方案中使用IoC,该解决方案分为以下几个项目:

Toolbox.DAL
Toolbox.BL
Toolbox.EntityFramework
Toolbox.API(主项目)

要在我的主项目中注册组件,我使用以下代码:

using (WindsorContainer container = new WindsorContainer())
{
    AssemblyFilter filter = new AssemblyFilter(HttpRuntime.BinDirectory, "Toolbox.*.dll");
    IWindsorInstaller installer = FromAssembly.InDirectory(filter);

    return new CastleInitialiser(container.Install(installer));
}

然而,这导致了我的主项目中的依赖项被注册两次的问题 - 一次在正常初始化期间,然后再次从编译的程序集中注册。

有没有办法更改过滤器,以便它将获取除当前项目组件之外的所有组件?我一直在寻找,但找不到任何正确使用组装过滤器的正确例子。

2 个答案:

答案 0 :(得分:2)

只看source code

您可以添加其他过滤器。

using (WindsorContainer container = new WindsorContainer())
{
    AssemblyFilter filter = new AssemblyFilter(HttpRuntime.BinDirectory, "Toolbox.*.dll");

    //this
    filter = filter.FilterByName(name => !name.Name.Equals("Toolbox.API"));

    IWindsorInstaller installer = FromAssembly.InDirectory(filter);

    return new CastleInitialiser(container.Install(installer));
}

我的语法可能不是100%正确,但它应该说明如何做到这一点。

答案 1 :(得分:2)

您可以按名称过滤程序集:

AssemblyFilter filter = 
    new AssemblyFilter(HttpRuntime.BinDirectory, "Toolbox.*.dll")
        .FilterByName(an => !an.Name.StartsWith("Toolbox.API");