SignalR: использовать сервис с областью действия для IUserIdProvider - PullRequest
1 голос
/ 17 мая 2019

Я должен сделать вызов службы / БД, чтобы сопоставить UserId на основе требований запроса.Обычно я бы сделал это так же просто, как:

public class AuthUserIdProvider : IUserIdProvider
    {
        private IBusinessDependencies Dependencies { get; }

        public AuthUserIdProvider(IBusinessDependencies dependencies)
        {
            Dependencies = dependencies;
        }

        public string GetUserId(HubConnectionContext connection)
        {
            var email = connection.User.Claims.FirstOrDefault(m => m.Type.Equals(ClaimTypes.Email, StringComparison.OrdinalIgnoreCase))?.Value;

            if (string.IsNullOrEmpty(email))
            {
                return null;
            }

            return Dependencies.EntityServices.UserService.GetUserByEmailCached(email).GetAwaiter().GetResult().Id.ToString();
        }
    }

Однако область действия IBusinessDependencies ограничена, поскольку существует множество бизнес-логики, которая зависит от конкретного запроса / сеанса.

Можно ли зарегистрировать IUserIdProvider как область действия вместо синглтона?Или, может быть, есть другое лучшее решение?

1 Ответ

1 голос
/ 17 мая 2019

Мне никогда не приходилось использовать IUserIdProvider, но я не вижу ничего, что конкретно требует, чтобы было единичным.Возможно, я что-то пропустил, хотя.Тем не менее, я думаю, что вы, по крайней мере, должны попытаться зарегистрировать его как ограниченный до того, как приехать сюда (надеюсь).

Если предположить, что он должен быть одноэлементным, тогда единственным вариантом является шаблон службы-локатора.Вместо инъекции IBusinessDependencies вместо IServiceProvider.Тогда всякий раз, когда вам действительно нужен ваш экземпляр IBusinessDependencies, делайте:

using (var scope = _serviceProvider.CreateScope())
{
    var dependencies = scope.ServiceProvider.GetRequiredService<IBusinessDependencies>();
    // do something with dependencies
}

В случае, если это не очевидно, вы не можете сохранить свой экземпляр IBusinessDependencies на иваре или чем-то еще.Вам нужно будет извлекать его из коллекции сервисов каждый раз, когда вам нужно его использовать.

...