Экземпляр службы .NET Core Singleton в веб-контроллере - PullRequest
0 голосов
/ 01 марта 2019

Я довольно новый .NET, так что извините за мое невежество, и сейчас я пытаюсь узнать больше .NET Core.

У меня есть, например, пользовательский сервис, который используется в контроллере WebApi.Безопасно ли регистрировать пользовательский сервис как одиночный, или мне нужно зарегистрировать его как ограниченный?Меня беспокоит то, что если несколько пользователей вызывают одну и ту же конечную точку, например / users / me, она может возвращать информацию друг друга.Так ли это, или безопасно использовать единый сервис для извлечения таких данных из базы данных?Я получаю идентификатор пользователя из контекста http и использую userService.FindById (userId) для извлечения данных.Я не могу найти эту информацию из документации по жизненному циклу.Спасибо

1 Ответ

0 голосов
/ 01 марта 2019

Как правило, нет, это не будет проблемой.Исходя из упрощенного описания, нет возможности перехода.Однако, если вы выполняете какое-либо кэширование или иным образом сохраняете пользовательскую информацию в классе каким-либо образом (например, устанавливаете ivar), у вас могут возникнуть проблемы.Вообще говоря, если, кроме каких-либо зависимостей, которые вы вводите в конструктор, в противном случае класс можно сделать статическим и все еще работать, у вас все хорошо.Если вы делаете что-то внутренне, что помешало бы сделать класс статичным, то есть большая вероятность, что у вас утечка.

Тем не менее, если у вашего сервиса есть зависимости от сервисов с определенными областями, он должен быть сам по себе.С чем-то вроде «пользовательского» сервиса, есть большая вероятность, что вы будете полагаться на что-то вроде контекста EF или UserManager<TUser> и т. Д. Они ограничены, поэтому, если ваш сервис как одиночный, вы будете вынужденыиспользовать анти-шаблон сервис-локатор, и вы, скорее всего, будете делать что-то неэффективно в целом, пытаясь обойти зависимости, имеющие более короткий срок службы, чем сам сервис.В таком сценарии лучше всего сделать область обслуживания доступной, что позволит вам напрямую вводить зависимости области действия.

Похоже, существует наивная идея, что время жизни по умолчанию или предпочтительное время жизни должно быть единичным для таких вещей, как услуги, репозитории и т. Д.На самом деле, все наоборот: вы должны предпочесть ограниченную область, если нет веской явной причины поступать иначе.Например, если вы пытаетесь согласовать некоторый набор задач между потоками, используя что-то вроде SemaphoreSlim, это довольно очевидный сценарий, который потребовал бы времени жизни синглтона.Если вы не делаете что-то подобное, действительно требуется одиночное время жизни, используйте взамен ограниченное время жизни.

...