5.5 ComponentModel construction contributors 组件模型构造支持器

优质
小牛编辑
124浏览
2023-12-01

组件模型 构造支持器是实现了 IContributeComponentModelConstruction 接口的对象。顾名思义,在组件模型创建之后,它们其将正确的构造到最终状态。

:warning: 不要在支持器的外面修改 ComponentModel: 不鼓励在构造支持器的外面修改组建模型。在 组建模型 被它的构造支持器处理完成之后,它应该是只读的。 在以后的任何时候修改都可能导致并发(concurrency)问题或其他难以追查的问题。

IContributeComponentModelConstruction 接口

组件模型构造支持器需要实现这个方法:

void ProcessModel(IKernel kernel, ComponentModel model);

根据来自其他支持器,核心,模型的配置或状态的信息,支持器检查或修改 模型 参数。Windsor 使用内置支持器设置代理(proxying),参数(parameters),生命期方式(lifestyles),生命周期步骤(lifecycle steps,),依赖等。

自己的实现

编写自己的支持器是扩展/自定义 Windsor 最常用的方式。比方说我们希望所有组件的所有类型为 ILogger 的属性是必须的(Windsor 中的属性依赖默认情况下是可选的)。为此我们可以写一个支持器,像下面那样:

public class RequireLoggerProperties : IContributeComponentModelConstruction
{
    public void ProcessModel(IKernel kernel, ComponentModel model)
    {
        model.Properties
            .Where(p => p.Dependency.TargetType == typeof(ILogger))
            .All(p => p.Dependency.IsOptional = false);
    }
}

支持器扫描每个组件的所有属性依赖,寻找类型为 ILogger 的,并将其标记为必须的。

插入支持器

在创建支持器的时候,需要将其添加到容器的支持器集合 ComponentModelBuilder

container.Kernel.ComponentModelBuilder.AddContributor(new RequireLoggerProperties());

外部资源