【发布时间】:2015-01-02 23:52:49
【问题描述】:
在我的 MVC 应用程序中,我使用 SignalR 进行用户之间的通信。基本上,客户端调用集线器上的方法,集线器调用存储库上的方法,然后将消息保存到数据库,集线器将新消息通知其他客户端。
在来自客户端的这些调用期间,我使用了GetOwinContext() 方法,分别使用GetUserManager<UserManager>() 和Get<ApplicationDbcontex>() 扩展方法来获取UserManager 和ApplicationDbContext 的当前实例。但是,我注意到来自同一连接的调用使用相同的上下文,这显然不是一件好事。我继续并更改了我的存储库,现在是这样的:
public XyzRepository() //constructor
{
db = ApplicationDbContext.Create(); //static method that generates a new instance
}
private ApplicatonDbContext db { get; set; }
private UserManager UserManager
{
get
{
return new UserManager(new UserStore<ApplicationUser>(db)); //returns a new UserManager using the context that is used by this instance of the repository
}
}
由于我使用UserManager 引用ApplicationUser 对象(使用FindByIdAsync() 等,具体取决于设计),因此将我当前使用的上下文用于@ 的UserStore 非常重要987654332@ 的当前实例。每个请求创建一次存储库,这似乎按预期适用于每个 SignalR 调用。虽然到目前为止我在这个设计上没有遇到任何问题,但在阅读了这个问题(在this 文章中)之后,尤其是这一行:
"在当前的方法中,如果请求中有两个 UserManager 实例在同一个用户上工作,那么它们将使用用户对象的两个不同实例。", I决定向社区询问:
问题:什么是使用 ASP.NET Identity 的 UserManager 类和 SignalR 的首选方式,如果我使用相同的 DbContext 实例是必要的 UserManager 的 UserStore 使用的我的存储库的方法?
【问题讨论】:
标签: c# asp.net-mvc entity-framework signalr asp.net-identity