В моем приложении MVC пользователь I SignalR для связи между пользователями. В принципе, клиент вызывает метод на концентраторе, который вызывает метод в репозитории, который затем сохраняет сообщение в базе данных, а концентратор уведомляет другого клиента о новом сообщении.Время жизни класса UserManager SignalR и ASP.NET
я использовал метод GetOwinContext()
во время этих звонков от клиента, чтобы получить текущий экземпляр UserManager
и ApplicationDbContext
, используя методы расширения GetUserManager<UserManager>()
и Get<ApplicationDbcontex>()
соответственно. Тем не менее, я заметил, что вызовы из одного и того же соединения используют один и тот же контекст, что, очевидно, не очень хорошо. Я пошел вперед и изменил мое хранилище так, как это сейчас:
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
}
}
Поскольку я ссылаться на ApplicationUser
объектов с помощью UserManager
(с использованием FindByIdAsync()
и т.д., в зависимости от конструкции), крайне важно использовать контекст В настоящее время я работаю для UserStore
текущего экземпляра UserManager
. Репозиторий создается один раз за запрос, который, по-видимому, применяется к каждому вызову SignalR, как предполагалось. Пока я не испытывал проблем с этим дизайном, после прочтения этой проблемы (в статье this), в частности, этой строки:
«В текущем подходе, если в запросе есть два экземпляра UserManager, работать над тем же пользователем, они будут работать с двумя различными экземплярами пользовательского объекта», я решил обратиться к сообществу:.
Вопрос:, что является предпочтительным способом использовать UserManager
класс ASP.NET удостоверений с SignalR, если это императив, что я использую тот же экземпляр DbContext для методов моего хранилища t hat UserManager
UserStore
использует?
Спасибо, я сделал это.Однако Niject ведет себя несколько неожиданно. Используя 'InRequestScope()', после вызова первого метода на концентраторе он создает новые экземпляры репозитория, DbContext и UserManager, как предполагалось. Однако вызов дополнительных методов не приводит к появлению новых экземпляров; тот же контекст используется, что, конечно, очень неудачно. Но так как это несвязанная проблема, и ваш ответ был совершенным, я принимаю его. – Riwen
@Shinzon, пока все другие методы вызываются с тем же экземпляром DbContext во время одного и того же веб-запроса, я не согласен с тем, что это неудачно. Это намеренно и желательно ИМО. Я считаю, что InRequestScope хранит DbContext в HttpContext.Current.Items и удаляет его во время Application_EndRequest. Разве это не так? С таким видом вашего DbContext не будет жить слишком долго, но он будет жить достаточно долго, чтобы сделать все необходимое для одного веб-запроса. – danludwig
Проблема заключается в том, что Application_EndRequest не запускается при вызове метода SignalR с клиента, поэтому DbContext не удаляется. – Riwen