Asp.net Identity DbContext / Repository Issue

时间:2016-03-11 15:37:31

标签: asp.net asp.net-mvc asp.net-identity repository-pattern

我在我的MVC应用程序中使用Asp.Net身份。我可以看到它有自己的ApplicationDbContext - 虽然它连接到我在其他地方使用的我自己的DbContext所在的同一个SQL数据库。

所以我试图通过AccountController中我自己的代码访问我自己的一些数据 - 它似乎不起作用我认为是因为它认为哪个DBContext是活动的混淆?

我的代码:

public class AccountController : Controller
{
    private ApplicationSignInManager _signInManager;
    private ApplicationUserManager _userManager;
    private PostageManager postmgr;

    public AccountController()
    {
    }

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

    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;
        }
    }

    // GET: /Account/Register
    [AllowAnonymous]
    public ActionResult Register()
    {
        //create select list items for countries drop down
        List<SelectListItem> countries;
        countries = postmgr.GetCountries().Select(item => new SelectListItem
        {
            Value = item.Country,
            Text = item.Country
        }).ToList();
        countries.Insert(0, new SelectListItem { Value = string.Empty, Text = "Select delivery country or region...", Selected = true });
        RegisterViewModel mode = new RegisterViewModel
        {
            Countries = countries
        };
        return View();
    }

}

}

PostageManager只是一个位于我的DAL上以获取某些数据(使用存储库模式)的类 - 我只是使用一种传递方法来获取国家/地区列表,并以完全相同的方式使用它我有其他控制器工作正常。该类下面是我的存储库代码,它链接到我的默认连接字符串(DBContext)。它使用空引用异常在下一行中徘徊,我认为postmgr为null:

countries = postmgr.GetCountries().Select(item => new SelectListItem

相反,为了访问我自己的控制器中的身份数据,我已经完成了以下工作:

public BasketController(BasketManager _mgr, PostageManager _postmgr, ProductManager _prodmgr)
    {
        mgr = _mgr;
        postmgr = _postmgr;
        prodmgr = _prodmgr;
        shopper = Cart.GetShopperId();
        this.applicationDbContext = new ApplicationDbContext();
        this.userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.applicationDbContext));
    }

    protected ApplicationDbContext applicationDbContext { get; set; }
    protected UserManager<ApplicationUser> userManager { get; set; }

据我所知,它指出身份代码使用正确的DbContext - 我在我的AccountController中反过来看这个,但无法理解它。

我基本上只是希望能够使用我自己的代码从Identity控制器中获取我自己的数据,以帮助将额外的数据传递到视图。

2 个答案:

答案 0 :(得分:0)

我可能错了,但很可能postmgr字段没有从构造函数初始化,这就是为什么你有这个错误。 说明:

默认情况下,Asp将尝试通过不带参数的构造函数创建控制器实例。如果Asp找不到没有参数的构造函数,它将尝试使用参数调用构造函数,但为了使您可以在应用程序中配置IoC。由于您的控制器具有不带参数的构造函数,因此将由Asp选择。所以所有3个字段都是空的。

但是在属性SignInManager和UserManager中,您尝试从字段或OwinContext中获取值。当字段为空时,您的代码将从OwinContext中获取值。 OwinContext是一个非常复杂和智能的工具,可以根据Startup.Auth.cs文件或App_Start文件夹下的任何其他文件中提供的配置自动创建其上下文。

答案 1 :(得分:0)

我想我已经弄明白了 - 将以下内容添加到我的NinjectControllerFactory中:

        ninjectKernel.Bind<IAuthenticationManager>().ToMethod(c => HttpContext.Current.GetOwinContext().Authentication); //.InRequestScope();
        ninjectKernel.Bind<IUserStore<ApplicationUser>>().To<UserStore<ApplicationUser>>();
        ninjectKernel.Bind<UserManager<ApplicationUser>>().ToSelf();
        ninjectKernel.Bind<IRoleStore<IdentityRole, string>>().To<RoleStore<IdentityRole, string, IdentityUserRole>>();
        ninjectKernel.Bind<RoleManager<IdentityRole>>().ToSelf();

并将我的构造函数更改为:

 public AccountController(PostageManager _postmgr)
    {
        postmgr = _postmgr;
    }