У меня есть приложение ASP.NET Core 2.1, ссылающееся на пару решений .NET Standard 2.0. Я хочу использовать отражение и получить все типы и фильтры с конкретным реализованным интерфейсом, но он возвращает только общие интерфейсы, поэтому метод IsHandlerInterface
никогда не возвращает true.
List<AssemblyName> allAssemblies = Assembly.GetExecutingAssembly()
.GetReferencedAssemblies()
.Where(p => p.FullName.StartsWith("Something"))
.ToList(); // I get 4 assemblies here with the correct results
List<Type> allAssembliesTypes = allAssemblies
.Select(a => a.GetType())
.ToList(); // Retrieving the types
List<Type> handlerTypes = allAssembliesTypes
// typeof(ICommand).Assembly.GetTypes()
.Where(x => x.GetInterfaces().Any(y => IsHandlerInterface(y))) // Here I don't see the handler interface, only the generic ones, see method below
.Where(x => x.Name.EndsWith("Handler")) // Maybe redundant
.ToList();
private static bool IsHandlerInterface(Type type)
{
if (!type.IsGenericType)
return false;
Type typeDefinition = type.GetGenericTypeDefinition();
return typeDefinition == typeof(ICommandHandler<>) || typeDefinition == typeof(IQueryHandler<,>);
}
Пример обработчика ниже.
public sealed class SampleCommandHandler : ICommandHandler<SampleCommand>
{
public SampleCommandHandler() // inject services
{
}
public Task<Result> HandleAsync(SampleCommand command)
{
// command logic
// preconditions handle
// trigger events
throw new NotImplementedException();
}
}