В ASP.NET Core 1 некоторые дополнительные службы были добавлены в ConfigureServices() с помощью AddScoped().Как DI выбирает среди нескольких источников в ASP.NET Core 1
Одной из дополнительных услуг является «MyUserManager», которая наследуется от встроенного UserManager.
Трассировка стека отладки показывает, что по умолчанию UserClaimsPrincipalFactory использует UserManager по умолчанию вместо MyUserManager. Глядя на застройщик для UserClaimsPrincipalFactory:
public UserClaimsPrincipalFactory(
UserManager<TUser> userManager,
RoleManager<TRole> roleManager,
IOptions<IdentityOptions> optionsAccessor)
Я предполагаю, что зависимость инъекций используется для создания этой фабрики. Должны быть два типа, которые были бы совместимы для первого аргумента, MyUserManager или встроенного.
Есть ли способ обеспечить выбор MyUserManager или мне нужно предоставить пользовательский UserClaimsPrincipalFactory?
Как вообще выбрать DI, когда есть несколько служб соответствия, которые соответствуют аргументу?
Обновление 2/26/2016:
Я попытался удалить менеджер пользователя по умолчанию:
ServiceDescriptor defaultUserManager = services
.Single(s => s.ServiceType.FullName.StartsWith("Microsoft.AspNet.Identity.UserManager"));
services.Remove(defaultUserManager);
перед добавлением рудник
services.AddScoped(typeof(MyUserManager<MyAppUser>))
Эти строки работать нормально, но потом его броски:
Исключение броска п: 'System.InvalidOperationException' в mscorlib.dll
Дополнительная информация: Не удается разрешить услугу типа «Microsoft.AspNet.Identity.UserManager
1[MyAppUser]' while attempting to activate 'Microsoft.AspNet.Identity.UserClaimsPrincipalFactory
2 [MyAppUser, Microsoft.AspNet.Identity.EntityFramework.IdentityRole ]».
Таким образом, похоже, что совместимость через наследование не распознается двигателем DI.
Да. Я должен был добавить его дважды, хотя иначе AccountController также не сможет решить проблему. services.AddScoped, MyUserManager >() .AddScoped >() –
crokusek