我使用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
}
附加信息:
- 构造函数注入在控制器中工作。
- 彻底搜索了 DryIOC 容器配置以进行属性注入,但它是关于 WebApi 应用程序的,而不是我尝试的情况。
- 我试图切换顺序,
.WithDependencyInjectionAdapter(...)
但.With(rules => ...)
没有运气。 - 拦截也不适用于控制器。我正在使用@dadhi 的拦截建议:https ://bitbucket.org/dadhi/dryioc/wiki/Interception 。顺便说一句,您如何使用 Castle 和 DryIoC 为控制器注册拦截器?
- 我不会
CompositionRoot
在这里复制课程;它很无聊,很长而且不相关。
获得控制器属性注入和控制器方法拦截工作的任何想法?