using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.DependencyInjection; namespace NzbDrone.Common { public interface IServiceFactory { T Build() where T : class; IEnumerable BuildAll() where T : class; object Build(Type contract); IEnumerable GetImplementations(Type contract); } public class ServiceFactory : IServiceFactory { private readonly System.IServiceProvider _container; public ServiceFactory(System.IServiceProvider container) { _container = container; } public T Build() where T : class { return _container.GetRequiredService(); } public IEnumerable BuildAll() where T : class { return _container.GetServices().GroupBy(c => c.GetType().FullName).Select(g => g.First()); } public object Build(Type contract) { return _container.GetRequiredService(contract); } public IEnumerable GetImplementations(Type contract) { return _container.GetServices(contract).Select(x => x.GetType()); } } }