在代码中,我可以做一些这样的事在注册装配所有类型:温莎城堡:使用配置文件
container.Register(AllTypes.FromAssemblyNamed("AssemblyName"));
可以使用配置文件“Windsor.Config”我做同样的事情???
在代码中,我可以做一些这样的事在注册装配所有类型:温莎城堡:使用配置文件
container.Register(AllTypes.FromAssemblyNamed("AssemblyName"));
可以使用配置文件“Windsor.Config”我做同样的事情???
回复您的评论。
还有第三种方法(在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()
);
非常酷!我不知道有关Install()的重载。我通常先解决所有安装程序,然后分别调用Install()。 – Ryan 2010-08-03 01:51:22
Krzysztof:你是我的英雄:) 不幸的是我现在不能投票。 我会投15票。 – 2010-08-03 14:24:09
我非常肯定,只有使用流畅的配置API,才能为应用程序设置约定,以便在创建新组件时不需要单独注册它们,如示例所示。
你可以写一个简单的工具来做到这一点,如:
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表示流畅的配置。
为什么?你为什么不想在代码中做到这一点? – 2010-08-02 00:21:03
好吧,我正在处理一个涉及超过30个模块的巨大项目。 每个模块负责为相应的子系统提供演示UI。 每个子系统都有一个:域,存储库,核心,应用程序服务..等 和所有这些程序集必须在主容器中注册。 所以要么我必须在模块的代码(这意味着我应该将它们全部引用到模块) 或我必须修改主windsor配置文件(这是讨厌),每次我需要注册一个新组件。 – 2010-08-02 08:29:36