gpt4 book ai didi

c# - 使用当前用户 ID 初始化 ASP.NET MVC Controller

转载 作者:行者123 更新时间:2023-11-30 20:46:53 25 4
gpt4 key购买 nike

我创建了一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com