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;
protected 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)
{
return BasedOn((IEnumerable<Type>)new Type[1] {
basedOn
});
}
public BasedOnDescriptor BasedOn(params Type[] basedOn)
{
return BasedOn((IEnumerable<Type>)basedOn);
}
public BasedOnDescriptor BasedOn(IEnumerable<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(new Type[1] {
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)) {
using (IEnumerator<BasedOnDescriptor> enumerator2 = criterias.GetEnumerator()) {
while (enumerator2.MoveNext() && (!enumerator2.Current.TryRegister(item, kernel) || allowMultipleMatches)) {
}
}
}
}
}
}
}