Я знаю, что это уже решено, но я не смог найти ни одного примера о том, как на самом деле реализовать InstallerFactory, так что вот решение, если кто-нибудь ищет его.
Как использовать:
[InstallerPriority(0)]
public class ImportantInstallerToRunFirst : IWindsorInstaller
{
public void Install(IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
{
// do registrations
}
}
Просто добавьте атрибут InstallerPriority
с приоритетом для ваших классов, чувствительных к порядку установки.Установщики будут отсортированы по возрастанию.Установщики без приоритета по умолчанию будут иметь значение 100.
Как реализовать:
public class WindsorBootstrap : InstallerFactory
{
public override IEnumerable<Type> Select(IEnumerable<Type> installerTypes)
{
var retval = installerTypes.OrderBy(x => this.GetPriority(x));
return retval;
}
private int GetPriority(Type type)
{
var attribute = type.GetCustomAttributes(typeof(InstallerPriorityAttribute), false).FirstOrDefault() as InstallerPriorityAttribute;
return attribute != null ? attribute.Priority : InstallerPriorityAttribute.DefaultPriority;
}
}
[AttributeUsage(AttributeTargets.Class)]
public sealed class InstallerPriorityAttribute : Attribute
{
public const int DefaultPriority = 100;
public int Priority { get; private set; }
public InstallerPriorityAttribute(int priority)
{
this.Priority = priority;
}
}
При запуске приложения global.asax и т. Д .:
container.Install(FromAssembly.This(new WindsorBootstrap()));