2016-02-26 2 views
0

В 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.

ответ

0

DI выбирает последние зарегистрированные реализации сервиса.

Я думаю, проблема в том, что вы регистрируете свой тип реализации без указания ожидаемого типа службы. Вызов AddScoped следует изменить примерно так:

services.AddScoped(typeof(UserManager<>), typeof(MyUserManager<>)); 
+0

Да. Я должен был добавить его дважды, хотя иначе AccountController также не сможет решить проблему. services.AddScoped , MyUserManager >() .AddScoped >() – crokusek

0

Я считаю, нужно использовать функцию .AddTransient или использовать ContainerBuilder в функции ConfigureServices по следующему документу: Asp.net 5 dependency injection

Смежные вопросы