using Microsoft.Extensions.DependencyInjection;
using System.Threading.Tasks;
using System.Collections.Generic;
public string Result { get; set; }
public Response(string result)
public interface IValidator
Task<Response> Validate(object request);
public interface IFirstChildValidator : IValidator
public interface ISecondChildValidator : IValidator
class FirstBar : IFirstChildValidator
public Task<Response> Validate(object request)
return Task.FromResult(new Response(nameof(FirstBar)));
class FirstFoo : IFirstChildValidator
public Task<Response> Validate(object request)
return Task.FromResult(new Response(nameof(FirstFoo)));
class SecondBar : ISecondChildValidator
public Task<Response> Validate(object request)
return Task.FromResult(new Response(nameof(SecondBar)));
class SecondFoo : ISecondChildValidator
public Task<Response> Validate(object request)
return Task.FromResult(new Response(nameof(SecondFoo)));
private readonly IEnumerable<IFirstChildValidator> _firstValidators;
public Foo(IEnumerable<IFirstChildValidator> firstValidators)
_firstValidators = firstValidators;
foreach (var element in _firstValidators)
Console.WriteLine("Element type is {0}", element.GetType());
foreach(var i in element.GetType().GetInterfaces())
Console.WriteLine("--> And implement this interface {0}", i.Name);
public static void Main()
var services = new ServiceCollection();
services.Scan(scan => scan
.FromAssemblyOf<IFirstChildValidator>()
.AddClasses(classes => classes
.AssignableTo<IFirstChildValidator>())
.AsImplementedInterfaces()
services.AddScoped<Foo>();
var p = services.BuildServiceProvider();
var impl = p.GetService<Foo>();