Skip to content

Commit

Permalink
Seperate register & execute Bootstrapper tasks
Browse files Browse the repository at this point in the history
  • Loading branch information
Chris van de Steeg committed Jun 23, 2017
1 parent 7c3f0f2 commit b186a5c
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 27 deletions.
1 change: 1 addition & 0 deletions Src/Commons/BoC.csproj
Expand Up @@ -162,6 +162,7 @@
<Compile Include="Services\ModelQuery.cs" />
<Compile Include="Services\DefaultSetupTasks\AutoRegisterModelServices.cs" />
<Compile Include="Tasks\BaseBackgroundTask.cs" />
<Compile Include="Tasks\RegisterBootstrapTasks.cs" />
<Compile Include="Tasks\RegisterBackgroundTasks.cs" />
<Compile Include="Tasks\Bootstrapper.cs" />
<Compile Include="Tasks\BaseThreadedBackgroundTask.cs" />
Expand Down
2 changes: 1 addition & 1 deletion Src/Commons/Initializer.cs
Expand Up @@ -54,7 +54,7 @@ public static void Execute(IDependencyResolver dependencyResolver, params IAppDo
if (Executed)
return;
IoC.InitializeWith(dependencyResolver, appDomainHelpers);
new Bootstrapper(dependencyResolver, appDomainHelpers).Run();
dependencyResolver.Resolve<Bootstrapper>().Run();
Executed = true;
}

Expand Down
4 changes: 2 additions & 2 deletions Src/Commons/Properties/AssemblyInfo.cs
Expand Up @@ -32,7 +32,7 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("4.0.6.0")]
[assembly: AssemblyFileVersion("4.0.6.0")]
[assembly: AssemblyVersion("4.0.7.0")]
[assembly: AssemblyFileVersion("4.0.7.0")]

[assembly: AssemblyKeyFileAttribute("../../BoC.snk")]
40 changes: 16 additions & 24 deletions Src/Commons/Tasks/Bootstrapper.cs
@@ -1,51 +1,43 @@
using System;
using System.Collections.Generic;
using System.Linq;
using BoC.Helpers;
using BoC.InversionOfControl;

namespace BoC.Tasks
{
public class Bootstrapper
{
private readonly IDependencyResolver dependencyResolver;
private readonly IAppDomainHelper[] appDomainHelpers;
private static object bootstrapper_lock = new object();
public bool Executed { get; set; }

public Bootstrapper(IDependencyResolver dependencyResolver, IAppDomainHelper[] appDomainHelpers)
public Bootstrapper(IDependencyResolver dependencyResolver)
{
this.dependencyResolver = dependencyResolver;
this.appDomainHelpers = appDomainHelpers;
}

ICollection<Func<Type, bool>> taskFilters = new List<Func<Type, bool>>()
public static readonly ICollection<Func<Type, bool>> TaskFilters = new List<Func<Type, bool>>()
{
type => typeof(IBootstrapperTask).IsAssignableFrom(type),
type => !type.IsAbstract,
type => type.IsClass
};

private void RegisterAllTasks()
public virtual void Run()
{
var tasks = appDomainHelpers.SelectMany(helper => helper.GetTypes(t => taskFilters.All(func => func(t))));
foreach (var t in tasks)
if (Executed)
return;
lock (bootstrapper_lock)
{
dependencyResolver.RegisterType(typeof(IBootstrapperTask), t);
}
}
if (Executed)
return;

private void ExecuteTasks()
{
var tasks = dependencyResolver.ResolveAll<IBootstrapperTask>();
foreach (var task in tasks)
{
task.Execute();
var tasks = dependencyResolver.ResolveAll<IBootstrapperTask>();
foreach (var task in tasks)
{
task.Execute();
}
Executed = true;
}
}

public void Run()
{
RegisterAllTasks();
ExecuteTasks();
}
}
}
30 changes: 30 additions & 0 deletions Src/Commons/Tasks/RegisterBootstrapTasks.cs
@@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Linq;
using BoC.Helpers;
using BoC.InversionOfControl;

namespace BoC.Tasks
{
public class RegisterBootstrapTasks: IContainerInitializer
{
private readonly IDependencyResolver dependencyResolver;
private readonly IAppDomainHelper[] appDomainHelpers;

public RegisterBootstrapTasks(IDependencyResolver dependencyResolver, IAppDomainHelper[] appDomainHelpers)
{
this.dependencyResolver = dependencyResolver;
this.appDomainHelpers = appDomainHelpers;
}

public void Execute()
{
var tasks = appDomainHelpers.SelectMany(helper => helper.GetTypes(t => Bootstrapper.TaskFilters.All(func => func(t))));
foreach (var t in tasks)
{
dependencyResolver.RegisterType(typeof(IBootstrapperTask), t);
}
dependencyResolver.RegisterSingleton<Bootstrapper, Bootstrapper>();
}
}
}

0 comments on commit b186a5c

Please sign in to comment.