DryIoC не будет вводить свойства в контроллер ASP.NET Core MVC

Я использую https://bitbucket.org/dadhi/dryioc/src/589e7c0b356a/NetCore/src/DryIoc.AspNetCore.Sample качестве базового уровня. Попытался реализовать селектор на основе атрибутов с помощью следующего:

private static PropertyOrFieldServiceInfo GetImportedPropertiesAndFields(MemberInfo m, Request req)
    {
        var import = (DependencyAttribute)m.GetAttributes(typeof(DependencyAttribute)).FirstOrDefault();

        return import == null ? null : PropertyOrFieldServiceInfo.Of(m)
            .WithDetails(ServiceDetails.Of(import.ContractType, import.ContractName), req);
    }

где DependencyAttribute отмечает свойства, которые будут введены. Без встраивания этого решения в приложение ASP.NET MVC Core оно работает нормально. Когда я пытаюсь сделать это внедрить свойства в контроллерах с [Dependency] атрибут в приложении ASP.NET Core с помощью .WithDependencyInjectionAdapter(...), он не будет работать, он внедряет (и перехватывает) только те классы, которые были зарегистрированы после перехода в службы ConfigureServices (И в .AddDryIoc<TCompositionRoot> впоследствии).

Части кода, что я использую:

public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        return services.AddDryIoc<CompositionRoot>();
    }

DI класс:

public static class DI
{
    public static readonly PropertiesAndFieldsSelector SelectPropertiesAndFieldsWithDependencyAttribute = PropertiesAndFields.All(withInfo: GetImportedPropertiesAndFields);

    public static IServiceProvider AddDryIoc<TCompositionRoot>(this IServiceCollection services)
    {
        var logger = InfrastructureFactory.CreateDefaultNLogger().CreateLogger<Startup>();

        var container = new Container()
            .WithDependencyInjectionAdapter(services, throwIfUnresolved: type => type.Name.EndsWith("Controller"))
            .With(rules => rules.With(SelectPropertiesAndFieldsWithDependencyAttribute).WithoutThrowOnRegisteringDisposableTransient());

        container.RegisterMany<TCompositionRoot>();
        container.Resolve<TCompositionRoot>();

        logger.LogInformation("Verifying DryIoC resolutions...");

        var resolutionErrors = container.VerifyResolutions();

        if (resolutionErrors != null && resolutionErrors.Any())
        {
            foreach (var errors in container.VerifyResolutions())
            {
                logger.LogError($"DryIoC resolution error for type {errors.Key.ServiceType} : {errors.Value.Message} ({errors.Value.StackTrace})");
            }

            logger.LogWarning("DryIoC resolutions are WRONG.");
        }
        else
        {
            logger.LogInformation("DryIoC resolutions are OK.");
        }

        return container.Resolve<IServiceProvider>();
    }

    #region DryIoc Property Dependency Resolver helper
    private static PropertyOrFieldServiceInfo GetImportedPropertiesAndFields(MemberInfo m, Request req)
    {
        var import = (DependencyAttribute)m.GetAttributes(typeof(DependencyAttribute)).FirstOrDefault();

        return import == null ? null : PropertyOrFieldServiceInfo.Of(m)
            .WithDetails(ServiceDetails.Of(import.ContractType, import.ContractName), req);
    }
    #endregion

}

Дополнительная информация:

  1. Конструктор впрыска работает в контроллерах.
  2. Тщательно искал в конфигурации DryIOC Container свойства, но речь идет о приложении WebApi, а не о том, что я пытаюсь сделать.
  3. Я пытался изменить порядок .WithDependencyInjectionAdapter(...) а также .With(rules => ...) без удачи
  4. Перехват не работает и для контроллеров. Я использую рекомендацию @ dadhi для перехвата: https://bitbucket.org/dadhi/dryioc/wiki/Interception. Кстати, как вы регистрируете перехватчик для контроллера с Castle и DryIoC?
  5. Я не буду копировать CompositionRoot класс здесь; это скучно, долго и не актуально.

Любые идеи, чтобы получить инъекции свойства контроллера и перехват метода контроллера работы?

1 ответ

Решение

Пожалуйста уточни AddControllersAsServices() на настроенном сервисном сборе. Это объясняет почему.

Образец уже включает это, а также пример внедрения свойства.

Другие вопросы по тегам