mirror of https://github.com/abpframework/abp.git
3 changed files with 159 additions and 3 deletions
@ -0,0 +1,135 @@ |
|||||
|
using System; |
||||
|
using Microsoft.AspNetCore.Authorization; |
||||
|
using Microsoft.AspNetCore.SignalR; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Microsoft.Extensions.Localization; |
||||
|
using Microsoft.Extensions.Logging; |
||||
|
using Microsoft.Extensions.Logging.Abstractions; |
||||
|
using Volo.Abp.Localization; |
||||
|
using Volo.Abp.MultiTenancy; |
||||
|
using Volo.Abp.Timing; |
||||
|
using Volo.Abp.Users; |
||||
|
|
||||
|
namespace Volo.Abp.AspNetCore.SignalR |
||||
|
{ |
||||
|
public abstract class AbpHub : Hub |
||||
|
{ |
||||
|
public IServiceProvider ServiceProvider { get; set; } |
||||
|
protected readonly object ServiceProviderLock = new object(); |
||||
|
|
||||
|
protected TService LazyGetRequiredService<TService>(ref TService reference) |
||||
|
=> LazyGetRequiredService(typeof(TService), ref reference); |
||||
|
|
||||
|
protected TRef LazyGetRequiredService<TRef>(Type serviceType, ref TRef reference) |
||||
|
{ |
||||
|
if (reference == null) |
||||
|
{ |
||||
|
lock (ServiceProviderLock) |
||||
|
{ |
||||
|
if (reference == null) |
||||
|
{ |
||||
|
reference = (TRef)ServiceProvider.GetRequiredService(serviceType); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return reference; |
||||
|
} |
||||
|
|
||||
|
public ILoggerFactory LoggerFactory => LazyGetRequiredService(ref _loggerFactory); |
||||
|
private ILoggerFactory _loggerFactory; |
||||
|
|
||||
|
protected ILogger Logger => _lazyLogger.Value; |
||||
|
private Lazy<ILogger> _lazyLogger => new Lazy<ILogger>(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true); |
||||
|
|
||||
|
public ICurrentUser CurrentUser => LazyGetRequiredService(ref _currentUser); |
||||
|
private ICurrentUser _currentUser; |
||||
|
|
||||
|
public ICurrentTenant CurrentTenant => LazyGetRequiredService(ref _currentTenant); |
||||
|
private ICurrentTenant _currentTenant; |
||||
|
|
||||
|
public IAuthorizationService AuthorizationService => LazyGetRequiredService(ref _authorizationService); |
||||
|
private IAuthorizationService _authorizationService; |
||||
|
|
||||
|
public IClock Clock => LazyGetRequiredService(ref _clock); |
||||
|
private IClock _clock; |
||||
|
|
||||
|
public IStringLocalizerFactory StringLocalizerFactory => LazyGetRequiredService(ref _stringLocalizerFactory); |
||||
|
private IStringLocalizerFactory _stringLocalizerFactory; |
||||
|
|
||||
|
public IStringLocalizer L => _localizer ?? (_localizer = StringLocalizerFactory.Create(LocalizationResource)); |
||||
|
private IStringLocalizer _localizer; |
||||
|
|
||||
|
protected Type LocalizationResource |
||||
|
{ |
||||
|
get => _localizationResource; |
||||
|
set |
||||
|
{ |
||||
|
_localizationResource = value; |
||||
|
_localizer = null; |
||||
|
} |
||||
|
} |
||||
|
private Type _localizationResource = typeof(DefaultResource); |
||||
|
} |
||||
|
|
||||
|
public abstract class AbpHub<T> : Hub<T> |
||||
|
where T : class |
||||
|
{ |
||||
|
public IServiceProvider ServiceProvider { get; set; } |
||||
|
protected readonly object ServiceProviderLock = new object(); |
||||
|
|
||||
|
protected TService LazyGetRequiredService<TService>(ref TService reference) |
||||
|
=> LazyGetRequiredService(typeof(TService), ref reference); |
||||
|
|
||||
|
protected TRef LazyGetRequiredService<TRef>(Type serviceType, ref TRef reference) |
||||
|
{ |
||||
|
if (reference == null) |
||||
|
{ |
||||
|
lock (ServiceProviderLock) |
||||
|
{ |
||||
|
if (reference == null) |
||||
|
{ |
||||
|
reference = (TRef)ServiceProvider.GetRequiredService(serviceType); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return reference; |
||||
|
} |
||||
|
|
||||
|
public ILoggerFactory LoggerFactory => LazyGetRequiredService(ref _loggerFactory); |
||||
|
private ILoggerFactory _loggerFactory; |
||||
|
|
||||
|
protected ILogger Logger => _lazyLogger.Value; |
||||
|
private Lazy<ILogger> _lazyLogger => new Lazy<ILogger>(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true); |
||||
|
|
||||
|
public ICurrentUser CurrentUser => LazyGetRequiredService(ref _currentUser); |
||||
|
private ICurrentUser _currentUser; |
||||
|
|
||||
|
public ICurrentTenant CurrentTenant => LazyGetRequiredService(ref _currentTenant); |
||||
|
private ICurrentTenant _currentTenant; |
||||
|
|
||||
|
public IAuthorizationService AuthorizationService => LazyGetRequiredService(ref _authorizationService); |
||||
|
private IAuthorizationService _authorizationService; |
||||
|
|
||||
|
public IClock Clock => LazyGetRequiredService(ref _clock); |
||||
|
private IClock _clock; |
||||
|
|
||||
|
public IStringLocalizerFactory StringLocalizerFactory => LazyGetRequiredService(ref _stringLocalizerFactory); |
||||
|
private IStringLocalizerFactory _stringLocalizerFactory; |
||||
|
|
||||
|
public IStringLocalizer L => _localizer ?? (_localizer = StringLocalizerFactory.Create(LocalizationResource)); |
||||
|
private IStringLocalizer _localizer; |
||||
|
|
||||
|
protected Type LocalizationResource |
||||
|
{ |
||||
|
get => _localizationResource; |
||||
|
set |
||||
|
{ |
||||
|
_localizationResource = value; |
||||
|
_localizer = null; |
||||
|
} |
||||
|
} |
||||
|
private Type _localizationResource = typeof(DefaultResource); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,21 @@ |
|||||
|
using Microsoft.AspNetCore.SignalR; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
using Volo.Abp.Users; |
||||
|
|
||||
|
namespace Volo.Abp.AspNetCore.SignalR |
||||
|
{ |
||||
|
public class AbpSignalRUserIdProvider : IUserIdProvider, ITransientDependency |
||||
|
{ |
||||
|
public ICurrentUser CurrentUser { get; } |
||||
|
|
||||
|
public AbpSignalRUserIdProvider(ICurrentUser currentUser) |
||||
|
{ |
||||
|
CurrentUser = currentUser; |
||||
|
} |
||||
|
|
||||
|
public virtual string GetUserId(HubConnectionContext connection) |
||||
|
{ |
||||
|
return CurrentUser.Id?.ToString(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue