1

我使用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);
    }

whereDependencyAttribute标记要注入的属性。如果不将此解决方案嵌入到 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 容器配置以进行属性注入,但它是关于 WebApi 应用程序的,而不是我尝试的情况。
  3. 我试图切换顺序,.WithDependencyInjectionAdapter(...).With(rules => ...)没有运气。
  4. 拦截也不适用于控制器。我正在使用@dadhi 的拦截建议:https ://bitbucket.org/dadhi/dryioc/wiki/Interception 。顺便说一句,您如何使用 Castle 和 DryIoC 为控制器注册拦截器?
  5. 我不会CompositionRoot在这里复制课程;它很无聊,很长而且不相关。

获得控制器属性注入和控制器方法拦截工作的任何想法?

4

1 回答 1

2

AddControllersAsServices()在配置的服务集合上指定。这就解释了为什么。

示例已经包含了这个,以及属性注入示例。

于 2017-05-30T14:10:09.487 回答