Настройте Unity.Ошибка «Не удается получить доступ к удаленному объекту. Имя объекта:« UserStore`1 ».» - PullRequest
0 голосов
/ 02 октября 2018

Я работаю над приложением с MVC5, EF 6 и использую ASP.NET Identity.Я использую инъекцию зависимостей Unity для разрешения моих классов.Моим примером было сообщение в блоге: https://tech.trailmax.info/2014/09/aspnet-identity-and-ioc-container-registration/

После того, как все сделано из статьи, и когда я впервые запускаю код, он дает мне: Тип Microsoft.AspNet.Identity.EntityFramework.UserStore`1 [[AppMVC.Models.ApplicationUser, AppMVC, версия = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]] не имеет конструктора, который принимает параметры (ApplicationDbContext). ошибка в этой строке в UnityConfig.RegisterTypes(Контейнер IUnityContainer) статический метод:

public static void RegisterTypes(IUnityContainer container)
        {
            // NOTE: To load from web.config uncomment the line below.
            // Make sure to add a Unity.Configuration to the using statements.
            // container.LoadConfiguration();

            // TODO: Register your type's mappings here.
            // container.RegisterType<IProductRepository, ProductRepository>();

            container.RegisterType<ApplicationDbContext>();
            container.RegisterType<ApplicationSignInManager>();
            container.RegisterType<ApplicationUserManager>();
            container.RegisterType<IUnitOfWork, UnitOfWork>();
            container.RegisterType<IBaseService<Picture>, PictureService>();
            container.RegisterType<IPictureService, PictureService>();
            container.RegisterType<IBaseService<UserExt>, UserExtService>();
            container.RegisterType<IUserExtService, UserExtService>();

            container.RegisterType<IAuthenticationManager>(
            new InjectionFactory(c => HttpContext.Current.GetOwinContext().Authentication));
            container.RegisterType<AccountController>();
            container.RegisterType<ManageController>();
            container.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager());
            container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager());
            container.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager());
        }

Специально в

container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new InjectionConstructor(typeof(ApplicationDbContext)));

После этого я изменил его на:

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

И ошибка исчезла.Когда я пытаюсь войти через свое приложение и нажимаю кнопку «Войти», я ввел метод входа в AccountController:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    // This doesn't count login failures towards account lockout
    // To enable password failures to trigger account lockout, change to shouldLockout: true
    var result = await signInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false);
    switch (result)
    {
        case SignInStatus.Success:
            return RedirectToLocal(returnUrl);
        case SignInStatus.LockedOut:
            return View("Lockout");
        case SignInStatus.RequiresVerification:
            return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
        case SignInStatus.Failure:
        default:
            ModelState.AddModelError("", "Invalid login attempt.");
            return View(model);
    }
}   

Затем, когда я вхожу в систему

var result = await signInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false);

, я сразу же получаюв

protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (userManager != null)
            {
                userManager.Dispose();
                userManager = null;
            }

            if (signInManager != null)
            {
                signInManager.Dispose();
                signInManager = null;
            }
        }

        base.Dispose(disposing);
    }

С ошибкой: enter image description here

Конструктор моего AccountController выглядит следующим образом

[Authorize]
    public class AccountController : Controller
    {
        private  ApplicationUserManager userManager;
        private  ApplicationSignInManager signInManager;
        private readonly IAuthenticationManager authenticationManager;

        public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager, IAuthenticationManager authenticationManager)
        {
            this.userManager = userManager;
            this.signInManager = signInManager;
            this.authenticationManager = authenticationManager;
        }
}

Та же ошибка выдается, когда япопробуйте зарегистрировать нового пользователя: enter image description here

Может кто-нибудь сказать мне, что мне не хватает в моем коде?Заранее спасибо!

...