AssemblyInstaller
using Castle.Core.Internal;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace Castle.Windsor.Installer
{
public class AssemblyInstaller : IWindsorInstaller
{
private readonly Assembly assembly;
private readonly InstallerFactory factory;
public AssemblyInstaller(Assembly assembly, InstallerFactory factory)
{
if ((object)assembly == null)
throw new ArgumentNullException("assembly");
if (factory == null)
throw new ArgumentNullException("factory");
this.assembly = assembly;
this.factory = factory;
}
public void Install(IWindsorContainer container, IConfigurationStore store)
{
IEnumerable<Type> enumerable = factory.Select(FilterInstallerTypes(assembly.GetAvailableTypes(false)));
if (enumerable != null) {
foreach (Type item in enumerable) {
IWindsorInstaller windsorInstaller = factory.CreateInstance(item);
windsorInstaller.Install(container, store);
}
}
}
private IEnumerable<Type> FilterInstallerTypes(IEnumerable<Type> types)
{
return types.Where(delegate(Type t) {
if (t.IsClass && !t.IsAbstract && !t.IsGenericTypeDefinition)
return t.Is<IWindsorInstaller>();
return false;
});
}
}
}