var serviceCollection = new ServiceCollection() .AddSingleton<IWeatherServiceApi, UsWeatherServiceApi>() .AddSingleton<IWeatherServiceApi, CanadaWeatherServiceApi>() .AddSingleton<IWeatherServiceParser, UsWeatherServiceParser>() .AddSingleton<IWeatherServiceParser, CanadaWeatherServiceParser>() .AddSingleton<Func<string, IWeatherServiceApi>>(WeatherServiceApiFactory) .AddSingleton<Func<string, IWeatherServiceParser>>(WeatherServiceParserFactory) .AddSingleton<TextWriter>(Console.Out) .AddSingleton<TextReader>(Console.In) .AddSingleton<IWeatherService, WeatherService>() .AddSingleton<IDIDemoService, DIDemoService>(); ... private static Func<IServiceProvider, Func<string, IWeatherServiceApi>> WeatherServiceApiFactory => service => { return postalCode => { if (IsUsZipCode(postalCode)) { return service.GetServices<IWeatherServiceApi>().First(s => s is UsWeatherServiceApi); } if (IsCanadianPostalCode(postalCode)) { return service.GetServices<IWeatherServiceApi>().First(s => s is CanadaWeatherServiceApi); } throw new ArgumentException("Could not determine location"); }; }; private static Func<IServiceProvider, Func<string, IWeatherServiceParser>> WeatherServiceParserFactory => service => { return postalCode => { if (IsUsZipCode(postalCode)) { return service.GetServices<IWeatherServiceParser>().First(s => s is UsWeatherServiceParser); } if (IsCanadianPostalCode(postalCode)) { return service.GetServices<IWeatherServiceParser>().First(s => s is CanadaWeatherServiceParser); } throw new ArgumentException("Could not determine location"); }; };