Soluzione alternativa:
Se il tuo contenitore è in grado di convalidare la propria configurazione, puoi scrivere un test di integrazione per questo.
Questo non è un vero controllo del tempo di compilazione, ma se fa parte della tua suite di test, noterai ancora le dipendenze mancanti rapidamente.
Ovviamente funziona solo quando tutte le tue dipendenze sono conosciute al momento della compilazione.
Ecco un esempio di un mio recente progetto, che utilizza SimpleInjector .
SimpleInjector ha un metodo Verify()
, che tenta di risolvere tutte le dipendenze registrate .
Sto usando SimpleInjector in questo modo:
public class Bootstrapper
{
public static Container BuildContainer()
{
var container = new Container();
container.Register<IFoo, Foo>();
container.Register<IBar, Bar>();
// etc.
container.Verify();
return container;
}
}
public class Program
{
public static void Main(string[] args)
{
var container = Bootstrapper.BuildContainer();
container.GetInstance<IFoo>().Run();
}
}
Verify
genererà un'eccezione quando qualcosa va storto, quindi l'app si arresterà in modo anomalo in fase di runtime.
Per verificarlo mentre eseguivo la mia suite di test, ho scritto il seguente test (sintassi xUnit.net):
public class BootstrapperTests
{
[Fact]
public void DependenciesWereResolved()
{
bool error = false;
try
{
var container = Bootstrapper.BuildContainer();
}
catch (InvalidOperationException)
{
error = true;
}
Assert.False(error);
}
}
Nota: xUnit.net non ha nulla come Assert.DidNotThrow<Exception>
, ecco perché ho bisogno di intercettare l'eccezione e impostare la variabile error
.