Windsor-Castle:使用配置文件在程序集中注册所有类型

时间:2010-08-01 12:56:13

标签: c# configuration castle-windsor registration

代码中的

我可以做这样的事情:

container.Register(AllTypes.FromAssemblyNamed("AssemblyName"));

我可以使用配置文件“Windsor.Config”???

做同样的事情

3 个答案:

答案 0 :(得分:18)

  

回应你的评论。

还有第三种方式(在Windsor 2.5中,目前处于测试阶段2 - 预计很快就会发布)。

您可以让每个模块都引用Windsor,每个模块都有自己的一组Installers.

您可以使用新的目录扫描功能来安装所有这些程序集中的组件:

// In your root assembly
var container = new WindsorContainer();
container.Install(   
   FromAssembly.This(),
   FromAssembly.InDirectory(new AssemblyFilter("Modules")),
   Configuration.FromAppConfig()
)

此外,如果您的组件具有相同的结构,您还可以在单​​个安装程序中注册多个组件中的组件。 See more here.

container.Register(
   AllTypes.FromAssemblyInDirectory(new AssemblyFilter("Modules"))
      .Where(t=>t.Namespace.EndsWith(".Services"))
      .WithService.DefaultInterface()
);

答案 1 :(得分:1)

我很确定只有使用流畅的配置API才能为您的应用程序设置约定,以便在创建新组件时不需要单独注册它们,如示例所示。

答案 2 :(得分:1)

你可以写一个简单的设施,例如:

<强> AllTypesConfig.xml

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <facilities>
    <facility id="alltypes">
      <assemblies>
        <item>Castle.Core</item>
      </assemblies>
    </facility>
  </facilities>
</configuration>

<强>码

public class AllTypesFacility : AbstractFacility {
    protected override void Init() {
        var asmList = FacilityConfig.Children["assemblies"].Children;
        foreach (var asm in asmList)
            Kernel.Register(AllTypes.FromAssemblyNamed(asm.Value).Pick());
    }
}


var container = new WindsorContainer(@"..\..\AllTypesConfig.xml");
container.AddFacility("alltypes", new AllTypesFacility());
container.Resolve<NullLogger>();

如果您需要更多的灵活性,那么用XML表示流畅的配置将变得越来越难。