Не удалось разрешить службу, зарегистрированную с помощью сканирования сборки - PullRequest
1 голос
/ 14 февраля 2020

Конфигурация

У меня есть:

  • A. net core MVC app project
  • Проект модуля, содержащий
    • Контроллер (MyController),
    • Интерфейс репозитория (IMyRepository)
    • Репозиторий (MyRepository, который реализует IMyRepository и IRepository)

Основное приложение. net ссылается на проект модуля

Я использовал Scrutor в приложении MVC, чтобы захватить все классы, которые реализуют IRepositoy в любых ссылочных проектах, и зарегистрировать их в службах. коллекция:

public static void RegisterAllTypes<T>(this IServiceCollection services, ServiceLifetime lifetime = ServiceLifetime.Scoped)
{

    var entryAssembly = Assembly.GetEntryAssembly();
    var referencedAssemblies = entryAssembly.GetReferencedAssemblies().Select(Assembly.Load);
    var assemblies = new List<Assembly> { entryAssembly }.Concat(referencedAssemblies).ToArray();

    services.Scan(
        x =>
        {
            x.FromAssemblies(assemblies)
                .AddClasses(classes => classes.AssignableTo(typeof(T)))
                    .AsImplementedInterfaces()

                .WithLifetime(lifetime);
    });
}

Проблема

Если я изучу коллекцию сервисов, то увижу, что IMyRepository зарегистрирован и должен решить MyRepository . Тем не менее, хранилище при внедрении в MyController , как показано ниже:

private readonly IMyRepository _myRepository ;

public MyController(IMyRepository myRepository )
{
    _myRepository = myRepository;
}

выдает ошибку:

Невозможно разрешить службу для типа 'IMyRepository', в то время как пытаясь активировать MyController.

Если только ...

После регистрации репозиториев через Scrutor я поставил

var test = typeof(IMyRepository);

В этот момент все работает, как ожидалось. Но это побеждает весь смысл автоматизации c регистрации зависимостей.

Любая помощь с благодарностью.

1 Ответ

1 голос
/ 15 февраля 2020

Изменен метод регистрации для использования FromApplicationDependencies () , и теперь все вроде бы нормально.

public static void RegisterAllTypes<T>(this IServiceCollection services, ServiceLifetime lifetime = ServiceLifetime.Scoped)
{
    services.Scan(
        x =>
        {
            x.FromApplicationDependencies()
                .AddClasses(classes => classes.AssignableTo(typeof(T)))
                    .AsImplementedInterfaces()
                    .WithLifetime(lifetime);
        });
}
...