Welcome Guest, you are in: Login

Castle Project


Navigation (Windsor)

Search the wiki


This documentation is a work in progress.

Let us know if some information is not clear, inaccurate or missing. Also feel free to update the wiki yourself.

ComponentModel construction contributors

Modified on 2012/11/07 21:34 by Krzysztof Ko┼║mic Categorized as API, BuildingBlocks


ComponentModel construction contributors are objects that implement IContributeComponentModelConstruction interface. As their name implies they construct the ComponentModel into its final state right after it was created.

Don't modify ComponentModel outside of contributors

It is discouraged to modify component model elsewhere than in construction contributors. After ComponentModel is processed by its construction contributors it should be considered read only. Modifying it at any later point may lead to concurrency issues and other kinds of hard to track down issues.

The IContributeComponentModelConstruction interface

ComponentModel construction contributors are required to implement single method:
void ProcessModel(IKernel kernel, ComponentModel model);

Based on the information provided by other contributors, kernel, model's configuration or its own state they either inspect or modify the model parameter. Windsor uses several of built in contributors itself to set up things like proxying, parameters, lifestyles, lifecycle steps, dependencies etc.

Writing your own

Writing custom contributor is one of the most common ways of extending/customizing Windsor. For the sake of example let's say we want to make all properties of type ILogger on all components to be mandatory (By default property dependencies are optional in Windsor). To do that we could write a contributor that looks like the following:

public class RequireLoggerProperties : IContributeComponentModelConstruction
    public void ProcessModel(IKernel kernel, ComponentModel model)
            .Where(p => p.Dependency.TargetType == typeof(ILogger))
            .All(p => p.Dependency.IsOptional = false);
The contributor scans all property dependencies of each component, trying to find ones that have type ILogger and marks them as mandatory.

Plugging the contributor in

When you create your contributor you need to add it to the collection of contributors on container's ComponentModelBuilder:
container.Kernel.ComponentModelBuilder.AddContributor(new RequireLoggerProperties ());

External resources

Blogpost by Mark Seemann (Apr 26, 2010)

Blogpost by Ayende (Mar 11, 2007)

ScrewTurn Wiki version Some of the icons created by FamFamFam.