我创建了一个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()
会查找用户名""
(用户尚未授权)。
在用户通过身份验证后,是否可以初始化我的数据存储库?或者我可以仅在操作方法的呼叫期间识别用户吗?
答案 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);
}
}