1)加载程序集中所有定义了Castle.Model.CastleComponentAttribute 的组件
<facility id="batchregistration">
<assemblyBatch name="MyAssembly" useAttributes="true" />
</facility>
<assemblyBatch name="MyAssembly" useAttributes="true" />
</facility>
2)除Component1不会加载,其他定义了CastleComponentAttribute都会被加载
<facility id="batchregistration">
<assemblyBatch name="MyAssembly" useAttributes="true">
<exclude type="MyAssembly.Component1" />
</assemblyBatch>
</facility>
<assemblyBatch name="MyAssembly" useAttributes="true">
<exclude type="MyAssembly.Component1" />
</assemblyBatch>
</facility>
3)只加载Component2
<facility id="batchregistration">
<assemblyBatch name="MyAssembly" useAttributes="false">
<include key="other" component="MyAssembly.Component2" />
</assemblyBatch>
</facility>
<assemblyBatch name="MyAssembly" useAttributes="false">
<include key="other" component="MyAssembly.Component2" />
</assemblyBatch>
</facility>
4)加载Faclity
<facility id="batchregistration">
<addFacility id="facility1" type="MyAssembly.Facility1, MyAssembly" />
<addFacility id="facility2" type="MyAssembly.Facility2, MyAssembly" />
</facility>
<addFacility id="facility1" type="MyAssembly.Facility1, MyAssembly" />
<addFacility id="facility2" type="MyAssembly.Facility2, MyAssembly" />
</facility>
其实这个Facility做的就是根据配置扫描程序集然后动态加载到容器里面,虽然很简单却很灵活。比如你想更改一个component的行为,你只需要替换掉这个component的dll就行了,其他部分无需重新编译。
【使用方法】
1)建立这个Facility的配置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<facilities>
<facility id="batchregistration">
<assemblyBatch name="MyAssembly" useAttributes="true" />
</facility>
</facilities>
</configuration>
<configuration>
<facilities>
<facility id="batchregistration">
<assemblyBatch name="MyAssembly" useAttributes="true" />
</facility>
</facilities>
</configuration>
2)声明组件的class并把他编辑成配置文件里面MyAssembly.dll.
[CastleComponent("comp1")]
public class Component1
{
public Component1()
{
}
}
[CastleComponent("comp2")]
public class Component2
{
public Component2()
{
}
}
public class Component1
{
public Component1()
{
}
}
[CastleComponent("comp2")]
public class Component2
{
public Component2()
{
}
}
3)使用Facility,这样Component1和Component2就自动被加载了。
IWindsorContainer container = new WindsorContainer("../../CastleConfig.xml");
container.AddFacility( "batchregistration", new BatchRegistrationFacility() );
container.AddFacility( "batchregistration", new BatchRegistrationFacility() );