I also found that example a while ago, i make it work perfect both in
Asp.Net Mvc4 and WebApi2 project.
Use some IoC container (eg. Unity, Autofac) for WebApi project, the most important thing is implementing the interface IDependencyResolver to make your own dependency resolver.
Hers's my code snippet for WebApi project.
WebApiConfig
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
...
// using Microsoft.Extension.DependencyInjection here.
Startup.Bootstrapper(config);
}
}
Startup
public class Startup
{
public static void Bootstrapper(HttpConfiguration config)
{
var provider = Configuration();
var resolver = new DefaultDependencyResolver(provider);
config.DependencyResolver = resolver;
}
private static IServiceProvider Configuration()
{
var services = new ServiceCollection();
services.AddControllersAsServices(typeof(Startup).Assembly.GetExportedTypes()
.Where(t => !t.IsAbstract && !t.IsGenericTypeDefinition)
.Where(t => typeof(IHttpController).IsAssignableFrom(t)
|| t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)));
var serviceProvider = services.BuildServiceProvider();
return serviceProvider;
}
}
DefaultDependencyResolver
public class DefaultDependencyResolver : IDependencyResolver
{
private IServiceScope serviceScope;
protected IServiceProvider ServiceProvider { get; set; }
public DefaultDependencyResolver(IServiceProvider serviceProvider)
{
this.ServiceProvider = serviceProvider;
}
public object GetService(Type serviceType)
{
return this.ServiceProvider.GetService(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return this.ServiceProvider.GetServices(serviceType);
}
public IDependencyScope BeginScope()
{
serviceScope = this.ServiceProvider.CreateScope();
return new DefaultDependencyResolver(serviceScope.ServiceProvider);
}
public void Dispose()
{
// you can implement this interface just when you use .net core 2.0
// this.ServiceProvider.Dispose();
//need to dispose the scope otherwise
//you'll get a memory leak
serviceScope?.Dispose();
}
}
ServiceProviderExtensions
public static class ServiceProviderExtensions
{
public static IServiceCollection AddControllersAsServices(this IServiceCollection services,
IEnumerable<Type> controllerTypes)
{
foreach (var type in controllerTypes)
{
services.AddTransient(type);
}
return services;
}
}