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

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

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

相关文章:

c# - 是否可以在 .Net 应用程序中读取 Paradox 7.x .db 文件?

c# - 语法识别 unlimited '{' expr '}' next to each-other

css - 如何创建不遵循 site.css 模板的 View ?

c# - Mvc asp.net和n层架构

c# - 如何在 `RoleEntryPoint.OnStop()` 方法中优雅地关闭 mongod

c# - 等待的任务以取消状态结束不会抛出

asp.net-mvc - ASP.Net MVC Cookie 最佳实践

asp.net-mvc - 如何在asp.net core mvc header 中传递jwt token

asp.net-mvc-4 - MVC 路由不起作用

asp.net - MVC 4 - 用户模拟