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
}
Дополнительная информация:
- Конструктор впрыска работает в контроллерах.
- Тщательно искал в конфигурации DryIOC Container свойства, но речь идет о приложении WebApi, а не о том, что я пытаюсь сделать.
- Я пытался изменить порядок
.WithDependencyInjectionAdapter(...)
а также.With(rules => ...)
без удачи - Перехват не работает и для контроллеров. Я использую рекомендацию @ dadhi для перехвата: https://bitbucket.org/dadhi/dryioc/wiki/Interception. Кстати, как вы регистрируете перехватчик для контроллера с Castle и DryIoC?
- Я не буду копировать
CompositionRoot
класс здесь; это скучно, долго и не актуально.
Любые идеи, чтобы получить инъекции свойства контроллера и перехват метода контроллера работы?