Skip to content

Instantly share code, notes, and snippets.

@kylefritz
Created January 22, 2013 20:40
Show Gist options
  • Save kylefritz/4598198 to your computer and use it in GitHub Desktop.
Save kylefritz/4598198 to your computer and use it in GitHub Desktop.
Ninject DI for console apps.
using System;
using System.Collections.Generic;
using System.Linq;
using Ninject;
using Ninject.Extensions.Conventions;
using Ninject.Extensions.Conventions.BindingGenerators;
class Program
{
static void Main(string[] args)
{
var kernal = CreateKernel();
var _repo = kernal.Get<ISomeRepository>();
}
private static IKernel CreateKernel()
{
var settings = new NinjectSettings()
{
LoadExtensions = false
};
var kernel = new StandardKernel(settings);
kernel.Bind(scanner =>
{
scanner.FromAssemblyContaining<Some.Namespace.With.Classes.ILog>()
.SelectAllClasses()
//.Join
//.FromAssemblyContaining<Other.Namespace.With.Classes>()
//.SelectAllClasses()
.BindWith<TypeEndsWithInterfaceNameBindingGenerator>()
.Configure(binding => binding.InSingletonScope());
});
// choose implementation when things have two
kernel.Unbind<IImplemented>();
kernel.Bind<IImplemented>().To<CorrectlyImplemented>();
return kernel;
}
private sealed class TypeEndsWithInterfaceNameBindingGenerator : IBindingGenerator
{
public IEnumerable<Ninject.Syntax.IBindingWhenInNamedWithOrOnSyntax<object>> CreateBindings(
Type type,
Ninject.Syntax.IBindingRoot bindingRoot)
{
if (type.IsInterface || type.IsAbstract)
{
yield break;
}
foreach (var interfaceForType in type.GetInterfaces().Where(i => type.Name.EndsWith(i.Name.TrimStart('I').Split('`').First(), StringComparison.Ordinal)))
{
yield return (Ninject.Syntax.IBindingWhenInNamedWithOrOnSyntax<object>)bindingRoot
.Bind(interfaceForType)
.To(type)
.InSingletonScope();
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment