5

Если я серфинга в http://localhost:58472/Account/Register Я это исключениеСуществующие типы, IUserStore <ApplicationUser> и DbConnection, соответственно интерфейс и абстрактный класс и не могут быть построены

System.InvalidOperationException: Текущий тип, IUserStore<ApplicationUser>, является интерфейсом и не может быть сконструирован. Вам не хватает картографирования типов?

Вот мой код:

public class ApplicationUserManager : UserManager<ApplicationUser> 
{ 
    public ApplicationUserManager(IUserStore<ApplicationUser> store) 
     : base(store) 
    { } 

    public static ApplicationUserManager Create(
     IdentityFactoryOptions<ApplicationUserManager> options, 
     IOwinContext context) 
    { 
     var manager = new ApplicationUserManager(
      new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()) 
     ); 

     // other code 
     return manager; 
    } 
} 

и вот код в контроллер:

[Authorize] 
public class AccountController : Controller 
{ 
    private ApplicationSignInManager _signInManager; 
    private ApplicationUserManager _userManager; 

    public AccountController() 
    { 
    } 

    public AccountController(
     ApplicationUserManager userManager, 
     ApplicationSignInManager signInManager) 
    { 
     UserManager = userManager; 
     SignInManager = signInManager; 
    } 

    public ApplicationSignInManager SignInManager 
    { 
     get 
     { 
      return _signInManager ?? 
       HttpContext.GetOwinContext().Get<ApplicationSignInManager>(); 
     } 
     private set 
     { 
      _signInManager = value; 
     } 
    } 

    public ApplicationUserManager UserManager 
    { 
     get 
     { 
      return _userManager ?? 
       HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
     } 
     private set 
     { 
      _userManager = value; 
     } 
    } 

    [HttpGet] 
    [AllowAnonymous] 
    public ActionResult Login(string returnUrl) 
    { 
     ViewBag.ReturnUrl = returnUrl; 
     return View(); 
    } 
} 

Таким образом, вы можете увидеть, если вы читаете мой код, у меня ничего не изменилось в исходный код при создании нового проекта MVC, но у меня есть ошибка выше. Что я не так?

Я хорошо сделал новый контроллер с именем ProfileController с тем же кодом, что и в моем втором блоке кода, но без ApplicationSignInManager, потому что мне это не нужно.

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

public static class UnityConfig 
{ 
    public static void RegisterComponents() 
    { 
     var container = new UnityContainer(); 

     container.RegisterType<IGenericRepo<Category>, GenericRepo<Category>>(); 
     container.RegisterType<ICategoryService, CategoryService>(); 
     //container.RegisterType<IUser, ApplicationUser>(); 

     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 
    } 
} 

Если я раскомментирую строку в коде выше, при запуске сайта нет никакой разницы.


Update:

комментарием по @Jay я добавил этот код в менеджере Unity.

container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(); 

Теперь у меня есть это исключение:

System.InvalidOperationException: Текущий типа, System.Data.Common.DbConnection, является абстрактным классом и не может быть построен. Вам не хватает картографирования типов?

Вот некоторая информация из трассировки стека произошла

  1. InvalidOperationException

    Ошибка при попытке создать контроллер типа AccountController. Удостоверьтесь, что контроллер имеет безкоммертный публичный конструктор.

    Да, у меня есть общественный конструктор без партикуляров.

  2. ResolutionFailedException

    Постановление зависимости не удалось, тип = "AccountController", имя = "(none)".

Так я добавил эту строку в менеджере Unity:

container.RegisterType<IDbConnection, DbConnection>(); 

Но я до сих пор то же самое исключение.

Текущий тип, System.Data.Common.DbConnection ...


Update:

По замечанием @RandyLevy Я попытался это, помогая этим вопросом Configure Unity DI for ASP.NET Identity:

  1. Добавление этого к AccountController:

    // two fields added 
    private readonly UserManager<ApplicationUser> _userManager; 
    private readonly RoleManager<IdentityRole> _roleManager; 
    
    // constructor added 
    public AccountController(
        IUserStore<ApplicationUser> userStore, 
        IRoleStore<IdentityRole> roleStore, 
        ApplicationSignInManager signInManager) 
    { 
        _userManager = new UserManager<ApplicationUser>(userStore); 
        _roleManager = new RoleManager<IdentityRole>(roleStore); 
        SignInManager = signInManager; // I need this 
    } 
    
    public ApplicationSignInManager SignInManager // I need this 
    { 
        get 
        { 
         return _signInManager ?? 
          HttpContext.GetOwinContext().Get<ApplicationSignInManager>(); 
        } 
        private set 
        { 
         _signInManager = value; 
        } 
    } 
    
    public UserManager<ApplicationUser> UserManager // replace by other property 
                   // type of ApplicationUserManager 
    { 
        get 
        { 
         return _userManager ?? 
          HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
        } 
        //private set // comment this because _usermanager is readonly. 
        //{ 
        // _userManager = value; 
        //} 
    } 
    
    //public ApplicationUserManager UserManager // replaced by the property type of 
    //           // UserManager<ApplicationUser> 
    //{ 
    // get 
    // { 
    //  return _userManager ?? 
    //   HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
    // } 
    // private set 
    // { 
    //  _userManager = value; 
    // } 
    //} 
    
  2. Добавление этого в UnityManager:

    InjectionConstructor accountInjectionConstructor = 
        new InjectionConstructor(new ApplicationDbContext()); 
    
    container.RegisterType<AccountController>(); 
    container.RegisterType<IController, Controller>(); 
    
    container.RegisterType 
        <IRoleStore<IdentityRole>, RoleStore<IdentityRole>> 
        (accountInjectionConstructor); // on this line 
    
    container.RegisterType 
        <IUserStore<ApplicationUser>, UserStore<ApplicationUser>> 
        (accountInjectionConstructor); 
    

Но я получил эту ошибку (нет времени запуска исключения) на линии с комментарием:

Тип RoleStore<IdentityRole> не может быть использован в качестве параметра типа TTo в универсальном типе или метах спосо ниже:

UnityContainerExtensions.RegisterType<TFrom, TTo> 
    (IUnityContainer, params InjectionMember[]) 

Там нет неявного ссылочного преобразования из RoleStore<IdentityRole> в IRoleStore<IdentityRole>.

+2

Вам не хватает регистрационного типа для IUserStore ? – Jay

+1

https://stackoverflow.com/questions/21927785/configure-unity-di-for-asp-net -identity может помочь. –

+0

@Jay: Спасибо, за подсказку, но теперь у меня есть другое исключение. Больше информации в моем вопросе. –

ответ

13

Наконец-то я нашел решение для своей проблемы. Я добавляю этот код в менеджер Unity.

container.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager()); 
container.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager()); 
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager()); 
container.RegisterType<AccountController>(new InjectionConstructor()); 
+1

Я только начал получать ошибку, которую OP получал после того, как я установил Unity. Кажется, что-то связано с распознавателем зависимостей Unity, не работающим с собственной функциональностью Identity. Регистрация этих типов фиксировала его. – JARRRRG

2

Обновление для H. Pauwelyn. Исходная проблема заключается в том, что Unity пытается вызвать конструктор с двумя параметрами.

public AccountController(
    ApplicationUserManager userManager, 
    ApplicationSignInManager signInManager) 
{ 
    UserManager = userManager; 
    SignInManager = signInManager; 
} 

Следующая строка сообщит Unity о вызове конструктора без параметров и больше ничего не понадобится. Это сработало для меня.

container.RegisterType<AccountController>(new InjectionConstructor()); 

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

  • Нет связанных вопросов^_^