So, if [IoC is the Context](% post_url 2013-12-09-ioc-as-context %}) how do we leverage this concept so we can package it up nicely in our code bases. The goal is to use this context to unlock new aspects.
I have an application factory class that generates application instances.
The factory is responsible for bootstrapping the logging, doing all of the assembly scanning, then passes a [TypePool](% post_url 2014-09-10-typepool %}) and the container into the application.
{{< highlight csharp >}}
public static class AppFactory
{
public static Application Build
var pool = new TypePool();
//collect all assemblies for this host
var container = new Container();
//build up container
return new ApplicationInstance(container, pool);
} } {{< /highlight >}}
The application instance looks like this
{{< highlight csharp >}}
public interface Application : IDisposable
{
void Start();
TComponent Resolve
The Start method looks like
{{< highlight csharp >}} public class ApplicationInstance : Application { public void Start() { //run db migrations
//run all bootup code
}
//other stuff } {{< /highlight >}}
The ApplicationMarker looks like
{{< highlight csharp >}} public interface ApplicationMarker { void ConfigureContainer(TypePool pool, ContainerBuilder builder); } {{< /highlight >}}
Benefits include super simple testing a predictable and shared common architecture across command line apps web apps / messaging apps (this is very nice for larger companies)
In integration tests I can say things like:
{{< highlight csharp >}}
public class SampleTest
{
[Test]
public void Test()
{
var app = AppFactory.Build
Now I know that my app instance is the same as how its going to be built in in test as it is in the application host.