我创建了一个 ASP.NET MVC Controller ,它使用数据存储库中的数据进行响应。该存储库非常简单(位于 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()
会查找用户名 ""
(用户尚未授权) .
用户通过身份验证后是否可以初始化我的数据存储库?或者我可以只在操作方法调用期间识别用户吗?
最佳答案
标准做法是,您应该将用户 ID 作为参数传递给存储库方法,而不是使整个存储库基于它。
但是如果你想按照自己的方式做,你可以将 _repository
包裹起来。在属性中并在第一次调用时创建它。执行此操作的一个简单方法是使用 Lazy<T>
类(class)。这样,构造函数只会在第一次实际使用存储库时被调用,然后用户应该可用:
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);
}
}
关于c# - 使用当前用户 ID 初始化 ASP.NET MVC Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26377303/