Bootstrapping
Motivation
Implementation
public class BootstrapperBase:
IInitializable,
IExtensible<BootstrapperBase>,
IHaveAspects<BootstrapperBase>,
ICompositionModulesProvider,
IAssemblySourceProvider
{
private ModularityAspect _modularityAspect;
private DiscoveryAspect _discoveryAspect;
private readonly ExtensibilityAspect<BootstrapperBase> _concreteExtensibilityAspect;
private readonly AspectsWrapper _aspectsWrapper = new AspectsWrapper();
public BootstrapperBase()
{
_concreteExtensibilityAspect = new ExtensibilityAspect<BootstrapperBase>(this);
}
public IEnumerable<Assembly> Assemblies => _discoveryAspect.Assemblies;
IEnumerable<ICompositionModule> ICompositionModulesProvider<ICompositionModule>.Modules
=> _modularityAspect.Modules;
public BootstrapperBase Use(IMiddleware<BootstrapperBase> middleware)
=> _concreteExtensibilityAspect.Use(middleware);
public virtual CompositionOptions CompositionOptions => new CompositionOptions();
public void Initialize()
{
_aspectsWrapper.UseCoreAspects(CreateCoreAspects());
_aspectsWrapper.Initialize();
}
private IEnumerable<IAspect> CreateCoreAspects()
{
var aspects = new List<IAspect> { new PlatformAspect() };
_discoveryAspect = new DiscoveryAspect(CompositionOptions);
_modularityAspect = new ModularityAspect(_discoveryAspect, CompositionOptions);
aspects.Add(_modularityAspect);
aspects.Add(_discoveryAspect);
aspects.Add(_concreteExtensibilityAspect);
return aspects;
}
public BootstrapperBase UseAspect(IAspect aspect)
{
_aspectsWrapper.UseAspect(aspect);
return this;
}
}
Usage
Last updated