DryIoC 不会将属性注入 ASP.NET 核心 MVC 控制器

DryIoC won't inject properties into ASP.NET Core MVC controller

我使用 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] 属性在控制器中注入属性时53=] 核心应用程序使用 .WithDependencyInjectionAdapter(...),它不会工作,它只注入(和拦截)那些 classes,在 after 接管ConfigureServices 中的服务(以及之后 .AddDryIoc<TCompositionRoot> 中的服务)。

我使用的代码部分:

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

DI class:

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. 搜索 彻底,但它是关于 WebApi 应用程序的,不是我尝试的情况。
  3. 我尝试调换 .WithDependencyInjectionAdapter(...).With(rules => ...) 的顺序,但没有成功。
  4. 拦截也不适用于控制器。我正在使用@dadhi 的拦截建议: https://bitbucket.org/dadhi/dryioc/wiki/Interception 。顺便说一句,如何使用 Castle 和 DryIoC 为控制器注册拦截器?
  5. 我不会在这里复制CompositionRoot class;它很无聊,又长又不相关。

有什么让控制器 属性 注入和控制器方法拦截起作用的想法吗?

请在配置的服务集合上指定 AddControllersAsServices()This 解释原因。

Sample 已经包括这个,以及 属性 注入示例。