FromDescriptor
Describes the source of types to register.
using System;
using System.Collections.Generic;
namespace Castle.MicroKernel.Registration
{
public abstract class FromDescriptor : IRegistration
{
private readonly Predicate<Type> additionalFilters;
private readonly IList<BasedOnDescriptor> criterias;
private bool allowMultipleMatches;
internal FromDescriptor(Predicate<Type> additionalFilters)
{
this.additionalFilters = additionalFilters;
allowMultipleMatches = false;
criterias = new List<BasedOnDescriptor>();
}
protected abstract IEnumerable<Type> SelectedTypes(IKernel kernel);
public FromDescriptor AllowMultipleMatches()
{
allowMultipleMatches = true;
return this;
}
public BasedOnDescriptor BasedOn<T>()
{
return BasedOn(typeof(T));
}
public BasedOnDescriptor BasedOn(Type basedOn)
{
BasedOnDescriptor basedOnDescriptor = new BasedOnDescriptor(basedOn, this, additionalFilters);
criterias.Add(basedOnDescriptor);
return basedOnDescriptor;
}
public BasedOnDescriptor InNamespace(string namespace)
{
return Where(Component.IsInNamespace(namespace, false));
}
public BasedOnDescriptor InNamespace(string namespace, bool includeSubnamespaces)
{
return Where(Component.IsInNamespace(namespace, includeSubnamespaces));
}
public BasedOnDescriptor InSameNamespaceAs(Type type)
{
return Where(Component.IsInSameNamespaceAs(type));
}
public BasedOnDescriptor InSameNamespaceAs(Type type, bool includeSubnamespaces)
{
return Where(Component.IsInSameNamespaceAs(type, includeSubnamespaces));
}
public BasedOnDescriptor InSameNamespaceAs<T>()
{
return Where(Component.IsInSameNamespaceAs<T>());
}
public BasedOnDescriptor InSameNamespaceAs<T>(bool includeSubnamespaces) where T : class
{
return Where(Component.IsInSameNamespaceAs<T>(includeSubnamespaces));
}
public BasedOnDescriptor Pick()
{
return BasedOn<object>();
}
public BasedOnDescriptor Where(Predicate<Type> accepted)
{
BasedOnDescriptor basedOnDescriptor = new BasedOnDescriptor(typeof(object), this, additionalFilters).If(accepted);
criterias.Add(basedOnDescriptor);
return basedOnDescriptor;
}
void IRegistration.Register(IKernelInternal kernel)
{
if (criterias.Count != 0) {
foreach (Type item in SelectedTypes(kernel)) {
foreach (BasedOnDescriptor criteria in criterias) {
if (criteria.TryRegister(item, kernel) && !allowMultipleMatches)
break;
}
}
}
}
}
}