This may be obvious to some, but... Is there a way to resolve non-registered types with LightInject? Also, is it good practice to auto-magically resolve objects with DI frameworks without explicit injections for readability?
In my examples, I'm comparing super full featured frameworks (and possibly the slowest) to the one of the Lightest (and fastest) frameworks. That wasn't exactly a mistake :D
Constructor Injection (No Container)
private static void ComposeObjects()
{
var repository = new CSVRepository();
var viewModel = new PeopleViewerViewModel(repository);
Application.Current.MainWindow = new PeopleViewerWindow(viewModel);
}
Ninject
private void ConfigureContainer()
{
Container = new StandardKernel();
Container.Bind<IPersonRepository>().To<CSVRepository>()
.InSingletonScope();
}
private void ComposeObjects()
{
Application.Current.MainWindow = Container.Get<PeopleViewerWindow>();
}
Unity
private void ConfigureContainer()
{
Container = new UnityContainer();
Container.RegisterType<IPersonRepository, CSVRepository>(
new ContainerControlledLifetimeManager());
}
private void ComposeObjects()
{
Application.Current.MainWindow = Container.Resolve<PeopleViewerWindow>();
}
LightInject
private void ConfigureContainer()
{
Container = new ServiceContainer();
Container.Register<IPersonRepository, CSVRepository>(
new PerContainerLifetime());
// Do we need to explicitly register PeopleViewerWindow with LightInject?
Container.Register<PeopleViewerWindow>(
factory =>
new PeopleViewerWindow(new PeopleViewerViewModel
(Container.GetInstance<IPersonRepository>()))
);
}
private void ComposeObjects()
{
Application.Current.MainWindow = Container.GetInstance<PeopleViewerWindow>();
}