2010-08-01 109 views
4

在代码中,我可以做一些这样的事在注册装配所有类型:温莎城堡:使用配置文件

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

可以使用配置文件“Windsor.Config”我做同样的事情???

+4

为什么?你为什么不想在代码中做到这一点? – 2010-08-02 00:21:03

+0

好吧,我正在处理一个涉及超过30个模块的巨大项目。 每个模块负责为相应的子系统提供演示UI。 每个子系统都有一个:域,存储库,核心,应用程序服务..等 和所有这些程序集必须在主容器中注册。 所以要么我必须在模块的代码(这意味着我应该将它们全部引用到模块) 或我必须修改主windsor配置文件(这是讨厌),每次我需要注册一个新组件。 – 2010-08-02 08:29:36

回答

18

回复您的评论。

还有第三种方法(在Windsor 2.5中,目前处于测试版2 - 最终预计将很快推出)。

你可以有每个模块的引用温莎,并且每个模块都有自己的一套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() 
); 
+0

非常酷!我不知道有关Install()的重载。我通常先解决所有安装程序,然后分别调用Install()。 – Ryan 2010-08-03 01:51:22

+0

Krzysztof:你是我的英雄:) 不幸的是我现在不能投票。 我会投15票。 – 2010-08-03 14:24:09

1

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

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表示流畅的配置。