使用当前用户ID初始化ASP.NET MVC控制器

时间:2014-10-15 07:55:28

标签: c# asp.net-mvc asp.net-mvc-4

我创建了一个ASP.NET MVC控制器,它使用数据存储库中的数据进行响应。存储库非常简单(底层EF6后端),数据特定于用户。所以我的行为通常如下:

    public class MyController : Controller
    {
        private IRepository _repository = new MyDataContextRepository();

        [HttpPost]
        [Authorize]
        public ActionResult GetMyData()
        {
            var result = _repository.GetData(Membership.GetUser().ProviderUserKey);
            return Json(result);
        }
    }

但是因为我将在几乎所有的调用中使用用户ID,所以我想用当前用户的ID初始化存储库,就像这样。

    public class MyController : Controller
    {
        private IRepository _repository = new MyDataContextRepository(Membership.GetUser().ProviderUserKey);

        [HttpPost]
        [Authorize]
        public ActionResult GetMyData()
        {
            var result = _repository.GetData();
            return Json(result);
        }
    }

这里的问题是构造函数在用户正式登录之前运行,因此GetUser()会查找用户名""(用户尚未授权)。

在用户通过身份验证后,是否可以初始化我的数据存储库?或者我可以仅在操作方法的呼叫期间识别用户吗?

1 个答案:

答案 0 :(得分:3)

标准做法会说您应该将用户ID作为参数传递给存储库方法,而不是将整个存储库基于它。

但是如果你想按照自己的方式去做,你可以将_repository包装在一个属性中,并在第一次调用它时创建它。一种简单的方法是使用Lazy<T>类。通过这种方式,构造函数将仅在第一次实际使用存储库时调用,然后用户应该可用:

public class MyController : Controller
{
    private Lazy<IRepository> _repository = new Lazy<IRepository>(
        () => new MyDataContextRepository(Membership.GetUser().ProviderUserKey));

    private IRepository Repository
    {
        get { return _repository.Value; }
    }

    [HttpPost]
    [Authorize]
    public ActionResult GetMyData()
    {
        var result = Repository.GetData(); // the repository constructor will get called here
        return Json(result);
    }
}