10 changed files with 1165 additions and 1094 deletions
@ -1,455 +1,456 @@ |
|||
<?xml version="1.0"?> |
|||
<doc> |
|||
<assembly> |
|||
<name>LINGYUN.Abp.EventBus.CAP</name> |
|||
</assembly> |
|||
<members> |
|||
<member name="T:DotNetCore.CAP.ConsumerServiceSelector"> |
|||
<summary> |
|||
消费者查找器 |
|||
</summary> |
|||
</member> |
|||
<member name="P:DotNetCore.CAP.ConsumerServiceSelector.CapOptions"> |
|||
<summary> |
|||
CAP配置 |
|||
</summary> |
|||
</member> |
|||
<member name="P:DotNetCore.CAP.ConsumerServiceSelector.AbpDistributedEventBusOptions"> |
|||
<summary> |
|||
Abp分布式事件配置 |
|||
</summary> |
|||
</member> |
|||
<member name="P:DotNetCore.CAP.ConsumerServiceSelector.ServiceProvider"> |
|||
<summary> |
|||
服务提供者 |
|||
</summary> |
|||
</member> |
|||
<member name="M:DotNetCore.CAP.ConsumerServiceSelector.#ctor(System.IServiceProvider,Microsoft.Extensions.Options.IOptions{DotNetCore.CAP.CapOptions},Microsoft.Extensions.Options.IOptions{Volo.Abp.EventBus.Distributed.AbpDistributedEventBusOptions})"> |
|||
<summary> |
|||
Creates a new <see cref="T:DotNetCore.CAP.Internal.ConsumerServiceSelector" />. |
|||
</summary> |
|||
</member> |
|||
<member name="M:DotNetCore.CAP.ConsumerServiceSelector.FindConsumersFromInterfaceTypes(System.IServiceProvider)"> |
|||
<summary> |
|||
查找消费者集合 |
|||
</summary> |
|||
<param name="provider"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="M:DotNetCore.CAP.ConsumerServiceSelector.GetHandlerDescription(System.Type,System.Type)"> |
|||
<summary> |
|||
获取事件处理器集合 |
|||
</summary> |
|||
<param name="eventType"></param> |
|||
<param name="typeInfo"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="T:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker"> |
|||
<summary> |
|||
过期消息清理任务 |
|||
</summary> |
|||
</member> |
|||
<member name="P:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.Options"> |
|||
<summary> |
|||
过期消息清理配置 |
|||
</summary> |
|||
</member> |
|||
<member name="P:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.Initializer"> |
|||
<summary> |
|||
Initializer |
|||
</summary> |
|||
</member> |
|||
<member name="P:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.Storage"> |
|||
<summary> |
|||
Storage |
|||
</summary> |
|||
</member> |
|||
<member name="M:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.#ctor(Volo.Abp.Threading.AbpAsyncTimer,DotNetCore.CAP.Persistence.IDataStorage,DotNetCore.CAP.Persistence.IStorageInitializer,Microsoft.Extensions.Options.IOptions{LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions},Microsoft.Extensions.DependencyInjection.IServiceScopeFactory)"> |
|||
<summary> |
|||
创建过期消息清理任务 |
|||
</summary> |
|||
<param name="timer"></param> |
|||
<param name="storage"></param> |
|||
<param name="initializer"></param> |
|||
<param name="options"></param> |
|||
<param name="serviceScopeFactory"></param> |
|||
</member> |
|||
<member name="M:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.DoWorkAsync(Volo.Abp.BackgroundWorkers.PeriodicBackgroundWorkerContext)"> |
|||
<summary> |
|||
异步执行任务 |
|||
</summary> |
|||
<param name="workerContext"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="T:DotNetCore.CAP.Processor.AbpCapProcessingServer"> |
|||
<summary> |
|||
CapProcessingServer |
|||
</summary> |
|||
</member> |
|||
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.#ctor(Microsoft.Extensions.Logging.ILogger{DotNetCore.CAP.Processor.AbpCapProcessingServer},Microsoft.Extensions.Logging.ILoggerFactory,System.IServiceProvider)"> |
|||
<summary> |
|||
CapProcessingServer |
|||
</summary> |
|||
<param name="logger"></param> |
|||
<param name="loggerFactory"></param> |
|||
<param name="provider"></param> |
|||
</member> |
|||
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Start"> |
|||
<summary> |
|||
Start |
|||
</summary> |
|||
</member> |
|||
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Pulse"> |
|||
<summary> |
|||
Pulse |
|||
</summary> |
|||
</member> |
|||
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Dispose"> |
|||
<summary> |
|||
Dispose |
|||
</summary> |
|||
</member> |
|||
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusModule"> |
|||
<summary> |
|||
AbpCAPEventBusModule |
|||
</summary> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusModule.ConfigureServices(Volo.Abp.Modularity.ServiceConfigurationContext)"> |
|||
<summary> |
|||
ConfigureServices |
|||
</summary> |
|||
<param name="context"></param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusModule.OnApplicationInitialization(Volo.Abp.ApplicationInitializationContext)"> |
|||
<summary> |
|||
OnApplicationInitialization |
|||
</summary> |
|||
<param name="context"></param> |
|||
</member> |
|||
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions"> |
|||
<summary> |
|||
过期消息清理配置项 |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions.NotifyFailedCallback"> |
|||
<summary> |
|||
发布消息处理失败通知 |
|||
default: false |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions.CleanUpExpiresMessageBatch"> |
|||
<summary> |
|||
批量清理数量 |
|||
default: 1000 |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions.CleanUpExpiresMessageInterval"> |
|||
<summary> |
|||
执行间隔(ms) |
|||
default: 3600000 (1 hours) |
|||
</summary> |
|||
</member> |
|||
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException"> |
|||
<summary> |
|||
AbpECAPExecutionFailedException |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.MessageType"> |
|||
<summary> |
|||
MessageType |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.Origin"> |
|||
<summary> |
|||
Message |
|||
</summary> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.#ctor(DotNetCore.CAP.Messages.MessageType,DotNetCore.CAP.Messages.Message)"> |
|||
<summary> |
|||
constructor |
|||
</summary> |
|||
<param name="messageType"></param> |
|||
<param name="origin"></param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.#ctor(DotNetCore.CAP.Messages.MessageType,DotNetCore.CAP.Messages.Message,System.String)"> |
|||
<summary> |
|||
constructor |
|||
</summary> |
|||
<param name="messageType"></param> |
|||
<param name="origin"></param> |
|||
<param name="message"></param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.#ctor(DotNetCore.CAP.Messages.MessageType,DotNetCore.CAP.Messages.Message,System.String,System.Exception)"> |
|||
<summary> |
|||
constructor |
|||
</summary> |
|||
<param name="messageType"></param> |
|||
<param name="origin"></param> |
|||
<param name="message"></param> |
|||
<param name="innerException"></param> |
|||
</member> |
|||
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPMessageExtensions"> |
|||
<summary> |
|||
CAP消息扩展 |
|||
</summary> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPMessageExtensions.TryGetTenantId(DotNetCore.CAP.Messages.Message,System.Nullable{System.Guid}@)"> |
|||
<summary> |
|||
尝试获取消息标头中的租户标识 |
|||
</summary> |
|||
<param name="message"></param> |
|||
<param name="tenantId"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPMessageExtensions.GetTenantIdOrNull(DotNetCore.CAP.Messages.Message)"> |
|||
<summary> |
|||
获取消息标头中的租户标识 |
|||
</summary> |
|||
<param name="message"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker"> |
|||
<summary> |
|||
重写 ISubscribeInvoker 实现 Abp 租户集成 |
|||
</summary> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.#ctor(Microsoft.Extensions.Logging.ILoggerFactory,System.IServiceProvider,DotNetCore.CAP.Serialization.ISerializer,Volo.Abp.MultiTenancy.ICurrentTenant)"> |
|||
<summary> |
|||
AbpCAPSubscribeInvoker |
|||
</summary> |
|||
<param name="loggerFactory"></param> |
|||
<param name="serviceProvider"></param> |
|||
<param name="serializer"></param> |
|||
<param name="currentTenant"></param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.InvokeAsync(DotNetCore.CAP.Internal.ConsumerContext,System.Threading.CancellationToken)"> |
|||
<summary> |
|||
调用订阅者方法 |
|||
</summary> |
|||
<param name="context"></param> |
|||
<param name="cancellationToken"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.GetInstance(System.IServiceProvider,DotNetCore.CAP.Internal.ConsumerContext)"> |
|||
<summary> |
|||
获取事件处理类实例 |
|||
</summary> |
|||
<param name="provider"></param> |
|||
<param name="context"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.ExecuteWithParameterAsync(LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor,System.Object,System.Object[])"> |
|||
<summary> |
|||
通过给定的类型实例与参数调用订阅者方法 |
|||
</summary> |
|||
<param name="executor"></param> |
|||
<param name="class"></param> |
|||
<param name="parameter"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="T:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus"> |
|||
<summary> |
|||
CAP分布式事件总线 |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.AbpDistributedEventBusOptions"> |
|||
<summary> |
|||
Abp分布式事件总线配置 |
|||
</summary> |
|||
</member> |
|||
<member name="F:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CapPublisher"> |
|||
<summary> |
|||
CAP消息发布接口 |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CustomDistributedEventSubscriber"> |
|||
<summary> |
|||
自定义事件注册接口 |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.HandlerFactories"> |
|||
<summary> |
|||
本地事件处理器工厂对象集合 |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.EventTypes"> |
|||
<summary> |
|||
本地事件集合 |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CurrentUser"> |
|||
<summary> |
|||
当前用户 |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CurrentClient"> |
|||
<summary> |
|||
当前客户端 |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CancellationTokenProvider"> |
|||
<summary> |
|||
取消令牌 |
|||
</summary> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,Microsoft.Extensions.Options.IOptions{Volo.Abp.EventBus.Distributed.AbpDistributedEventBusOptions},DotNetCore.CAP.ICapPublisher,Volo.Abp.Users.ICurrentUser,Volo.Abp.Clients.ICurrentClient,Volo.Abp.MultiTenancy.ICurrentTenant,Volo.Abp.Threading.ICancellationTokenProvider,LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber)"> |
|||
<summary> |
|||
constructor |
|||
</summary> |
|||
<param name="serviceScopeFactory"></param> |
|||
<param name="distributedEventBusOptions"></param> |
|||
<param name="capPublisher"></param> |
|||
<param name="currentUser"></param> |
|||
<param name="currentTenant"></param> |
|||
<param name="currentClient"></param> |
|||
<param name="cancellationTokenProvider"></param> |
|||
<param name="customDistributedEventSubscriber"></param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Subscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)"> |
|||
<summary> |
|||
订阅事件 |
|||
</summary> |
|||
<param name="eventType"></param> |
|||
<param name="factory"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Unsubscribe``1(System.Func{``0,System.Threading.Tasks.Task})"> |
|||
<summary> |
|||
退订事件 |
|||
</summary> |
|||
<typeparam name="TEvent">事件类型</typeparam> |
|||
<param name="action"></param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Unsubscribe(System.Type,Volo.Abp.EventBus.IEventHandler)"> |
|||
<summary> |
|||
退订事件 |
|||
</summary> |
|||
<param name="eventType">事件类型</param> |
|||
<param name="handler">事件处理器</param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Unsubscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)"> |
|||
<summary> |
|||
退订事件 |
|||
</summary> |
|||
<param name="eventType">事件类型</param> |
|||
<param name="factory">事件处理器工厂</param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.UnsubscribeAll(System.Type)"> |
|||
<summary> |
|||
退订所有事件 |
|||
</summary> |
|||
<param name="eventType">事件类型</param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Subscribe``1(Volo.Abp.EventBus.Distributed.IDistributedEventHandler{``0})"> |
|||
<summary> |
|||
订阅事件 |
|||
</summary> |
|||
<typeparam name="TEvent">事件类型</typeparam> |
|||
<param name="handler">事件处理器</param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.PublishAsync(System.Type,System.Object)"> |
|||
<summary> |
|||
发布事件 |
|||
</summary> |
|||
<param name="eventType">事件类型</param> |
|||
<param name="eventData">事件数据对象</param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.GetHandlerFactories(System.Type)"> |
|||
<summary> |
|||
获取事件处理器工厂列表 |
|||
</summary> |
|||
<param name="eventType"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="T:LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber"> |
|||
<summary> |
|||
自定义事件订阅者 |
|||
</summary> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber.Subscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)"> |
|||
<summary> |
|||
订阅事件 |
|||
</summary> |
|||
<param name="eventType"></param> |
|||
<param name="factory"></param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber.UnSubscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)"> |
|||
<summary> |
|||
取消订阅 |
|||
</summary> |
|||
<param name="eventType"></param> |
|||
<param name="factory"></param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor.Execute(System.Object,System.Object[])"> |
|||
<summary> |
|||
Executes the configured method on <paramref name="target" />. This can be used whether or not |
|||
the configured method is asynchronous. |
|||
</summary> |
|||
<remarks> |
|||
Even if the target method is asynchronous, it's desirable to invoke it using Execute rather than |
|||
ExecuteAsync if you know at compile time what the return type is, because then you can directly |
|||
"await" that value (via a cast), and then the generated code will be able to reference the |
|||
resulting awaitable as a value-typed variable. If you use ExecuteAsync instead, the generated |
|||
code will have to treat the resulting awaitable as a boxed object, because it doesn't know at |
|||
compile time what type it would be. |
|||
</remarks> |
|||
<param name="target">The object whose method is to be executed.</param> |
|||
<param name="parameters">Parameters to pass to the method.</param> |
|||
<returns>The method return value.</returns> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor.ExecuteAsync(System.Object,System.Object[])"> |
|||
<summary> |
|||
Executes the configured method on <paramref name="target" />. This can only be used if the configured |
|||
method is asynchronous. |
|||
</summary> |
|||
<remarks> |
|||
If you don't know at compile time the type of the method's returned awaitable, you can use ExecuteAsync, |
|||
which supplies an awaitable-of-object. This always works, but can incur several extra heap allocations |
|||
as compared with using Execute and then using "await" on the result value typecasted to the known |
|||
awaitable type. The possible extra heap allocations are for: |
|||
1. The custom awaitable (though usually there's a heap allocation for this anyway, since normally |
|||
it's a reference type, and you normally create a new instance per call). |
|||
2. The custom awaiter (whether or not it's a value type, since if it's not, you need a new instance |
|||
of it, and if it is, it will have to be boxed so the calling code can reference it as an object). |
|||
3. The async result value, if it's a value type (it has to be boxed as an object, since the calling |
|||
code doesn't know what type it's going to be). |
|||
</remarks> |
|||
<param name="target">The object whose method is to be executed.</param> |
|||
<param name="parameters">Parameters to pass to the method.</param> |
|||
<returns>An object that you can "await" to get the method return value.</returns> |
|||
</member> |
|||
<member name="T:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutorAwaitable"> |
|||
<summary> |
|||
Provides a common awaitable structure that <see cref="M:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor.ExecuteAsync(System.Object,System.Object[])" /> can |
|||
return, regardless of whether the underlying value is a System.Task, an FSharpAsync, or an |
|||
application-defined custom awaitable. |
|||
</summary> |
|||
</member> |
|||
<member name="T:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutorFSharpSupport"> |
|||
<summary> |
|||
Helper for detecting whether a given type is FSharpAsync`1, and if so, supplying |
|||
an <see cref="T:System.Linq.Expressions.Expression" /> for mapping instances of that type to a C# awaitable. |
|||
</summary> |
|||
<remarks> |
|||
The main design goal here is to avoid taking a compile-time dependency on |
|||
FSharp.Core.dll, because non-F# applications wouldn't use it. So all the references |
|||
to FSharp types have to be constructed dynamically at runtime. |
|||
</remarks> |
|||
</member> |
|||
<member name="T:Microsoft.Extensions.DependencyInjection.ServiceCollectionExtensions"> |
|||
<summary> |
|||
CAP ServiceCollectionExtensions |
|||
</summary> |
|||
</member> |
|||
<member name="M:Microsoft.Extensions.DependencyInjection.ServiceCollectionExtensions.AddCAPEventBus(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{DotNetCore.CAP.CapOptions})"> |
|||
<summary> |
|||
Adds and configures the consistence services for the consistency. |
|||
</summary> |
|||
<param name="services"></param> |
|||
<param name="capAction"></param> |
|||
<returns></returns> |
|||
</member> |
|||
</members> |
|||
</doc> |
|||
<?xml version="1.0"?> |
|||
<doc> |
|||
<assembly> |
|||
<name>LINGYUN.Abp.EventBus.CAP</name> |
|||
</assembly> |
|||
<members> |
|||
<member name="T:DotNetCore.CAP.ConsumerServiceSelector"> |
|||
<summary> |
|||
消费者查找器 |
|||
</summary> |
|||
</member> |
|||
<member name="P:DotNetCore.CAP.ConsumerServiceSelector.CapOptions"> |
|||
<summary> |
|||
CAP配置 |
|||
</summary> |
|||
</member> |
|||
<member name="P:DotNetCore.CAP.ConsumerServiceSelector.AbpDistributedEventBusOptions"> |
|||
<summary> |
|||
Abp分布式事件配置 |
|||
</summary> |
|||
</member> |
|||
<member name="P:DotNetCore.CAP.ConsumerServiceSelector.ServiceProvider"> |
|||
<summary> |
|||
服务提供者 |
|||
</summary> |
|||
</member> |
|||
<member name="M:DotNetCore.CAP.ConsumerServiceSelector.#ctor(System.IServiceProvider,Microsoft.Extensions.Options.IOptions{DotNetCore.CAP.CapOptions},Microsoft.Extensions.Options.IOptions{Volo.Abp.EventBus.Distributed.AbpDistributedEventBusOptions})"> |
|||
<summary> |
|||
Creates a new <see cref="T:DotNetCore.CAP.Internal.ConsumerServiceSelector" />. |
|||
</summary> |
|||
</member> |
|||
<member name="M:DotNetCore.CAP.ConsumerServiceSelector.FindConsumersFromInterfaceTypes(System.IServiceProvider)"> |
|||
<summary> |
|||
查找消费者集合 |
|||
</summary> |
|||
<param name="provider"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="M:DotNetCore.CAP.ConsumerServiceSelector.GetHandlerDescription(System.Type,System.Type)"> |
|||
<summary> |
|||
获取事件处理器集合 |
|||
</summary> |
|||
<param name="eventType"></param> |
|||
<param name="typeInfo"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="T:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker"> |
|||
<summary> |
|||
过期消息清理任务 |
|||
</summary> |
|||
</member> |
|||
<member name="P:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.Options"> |
|||
<summary> |
|||
过期消息清理配置 |
|||
</summary> |
|||
</member> |
|||
<member name="P:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.Initializer"> |
|||
<summary> |
|||
Initializer |
|||
</summary> |
|||
</member> |
|||
<member name="P:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.Storage"> |
|||
<summary> |
|||
Storage |
|||
</summary> |
|||
</member> |
|||
<member name="M:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.#ctor(Volo.Abp.Threading.AbpAsyncTimer,DotNetCore.CAP.Persistence.IDataStorage,DotNetCore.CAP.Persistence.IStorageInitializer,Microsoft.Extensions.Options.IOptions{LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions},Microsoft.Extensions.DependencyInjection.IServiceScopeFactory)"> |
|||
<summary> |
|||
创建过期消息清理任务 |
|||
</summary> |
|||
<param name="timer"></param> |
|||
<param name="storage"></param> |
|||
<param name="initializer"></param> |
|||
<param name="options"></param> |
|||
<param name="serviceScopeFactory"></param> |
|||
</member> |
|||
<member name="M:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.DoWorkAsync(Volo.Abp.BackgroundWorkers.PeriodicBackgroundWorkerContext)"> |
|||
<summary> |
|||
异步执行任务 |
|||
</summary> |
|||
<param name="workerContext"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="T:DotNetCore.CAP.Processor.AbpCapProcessingServer"> |
|||
<summary> |
|||
CapProcessingServer |
|||
</summary> |
|||
</member> |
|||
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.#ctor(Microsoft.Extensions.Logging.ILogger{DotNetCore.CAP.Processor.AbpCapProcessingServer},Microsoft.Extensions.Logging.ILoggerFactory,System.IServiceProvider)"> |
|||
<summary> |
|||
CapProcessingServer |
|||
</summary> |
|||
<param name="logger"></param> |
|||
<param name="loggerFactory"></param> |
|||
<param name="provider"></param> |
|||
</member> |
|||
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Start(System.Threading.CancellationToken)"> |
|||
<summary> |
|||
Start |
|||
</summary> |
|||
</member> |
|||
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Pulse"> |
|||
<summary> |
|||
Pulse |
|||
</summary> |
|||
</member> |
|||
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Dispose"> |
|||
<summary> |
|||
Dispose |
|||
</summary> |
|||
</member> |
|||
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusModule"> |
|||
<summary> |
|||
AbpCAPEventBusModule |
|||
</summary> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusModule.ConfigureServices(Volo.Abp.Modularity.ServiceConfigurationContext)"> |
|||
<summary> |
|||
ConfigureServices |
|||
</summary> |
|||
<param name="context"></param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusModule.OnApplicationInitialization(Volo.Abp.ApplicationInitializationContext)"> |
|||
<summary> |
|||
OnApplicationInitialization |
|||
</summary> |
|||
<param name="context"></param> |
|||
</member> |
|||
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions"> |
|||
<summary> |
|||
过期消息清理配置项 |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions.NotifyFailedCallback"> |
|||
<summary> |
|||
发布消息处理失败通知 |
|||
default: false |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions.CleanUpExpiresMessageBatch"> |
|||
<summary> |
|||
批量清理数量 |
|||
default: 1000 |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions.CleanUpExpiresMessageInterval"> |
|||
<summary> |
|||
执行间隔(ms) |
|||
default: 3600000 (1 hours) |
|||
</summary> |
|||
</member> |
|||
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException"> |
|||
<summary> |
|||
AbpECAPExecutionFailedException |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.MessageType"> |
|||
<summary> |
|||
MessageType |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.Origin"> |
|||
<summary> |
|||
Message |
|||
</summary> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.#ctor(DotNetCore.CAP.Messages.MessageType,DotNetCore.CAP.Messages.Message)"> |
|||
<summary> |
|||
constructor |
|||
</summary> |
|||
<param name="messageType"></param> |
|||
<param name="origin"></param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.#ctor(DotNetCore.CAP.Messages.MessageType,DotNetCore.CAP.Messages.Message,System.String)"> |
|||
<summary> |
|||
constructor |
|||
</summary> |
|||
<param name="messageType"></param> |
|||
<param name="origin"></param> |
|||
<param name="message"></param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.#ctor(DotNetCore.CAP.Messages.MessageType,DotNetCore.CAP.Messages.Message,System.String,System.Exception)"> |
|||
<summary> |
|||
constructor |
|||
</summary> |
|||
<param name="messageType"></param> |
|||
<param name="origin"></param> |
|||
<param name="message"></param> |
|||
<param name="innerException"></param> |
|||
</member> |
|||
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPMessageExtensions"> |
|||
<summary> |
|||
CAP消息扩展 |
|||
</summary> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPMessageExtensions.TryGetTenantId(DotNetCore.CAP.Messages.Message,System.Nullable{System.Guid}@)"> |
|||
<summary> |
|||
尝试获取消息标头中的租户标识 |
|||
</summary> |
|||
<param name="message"></param> |
|||
<param name="tenantId"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPMessageExtensions.GetTenantIdOrNull(DotNetCore.CAP.Messages.Message)"> |
|||
<summary> |
|||
获取消息标头中的租户标识 |
|||
</summary> |
|||
<param name="message"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker"> |
|||
<summary> |
|||
重写 ISubscribeInvoker 实现 Abp 租户集成 |
|||
</summary> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.#ctor(Microsoft.Extensions.Logging.ILoggerFactory,System.IServiceProvider,DotNetCore.CAP.Serialization.ISerializer,Volo.Abp.MultiTenancy.ICurrentTenant)"> |
|||
<summary> |
|||
AbpCAPSubscribeInvoker |
|||
</summary> |
|||
<param name="loggerFactory"></param> |
|||
<param name="serviceProvider"></param> |
|||
<param name="serializer"></param> |
|||
<param name="currentTenant"></param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.InvokeAsync(DotNetCore.CAP.Internal.ConsumerContext,System.Threading.CancellationToken)"> |
|||
<summary> |
|||
调用订阅者方法 |
|||
</summary> |
|||
<param name="context"></param> |
|||
<param name="cancellationToken"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.GetInstance(System.IServiceProvider,DotNetCore.CAP.Internal.ConsumerContext)"> |
|||
<summary> |
|||
获取事件处理类实例 |
|||
</summary> |
|||
<param name="provider"></param> |
|||
<param name="context"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.ExecuteWithParameterAsync(LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor,System.Object,System.Object[])"> |
|||
<summary> |
|||
通过给定的类型实例与参数调用订阅者方法 |
|||
</summary> |
|||
<param name="executor"></param> |
|||
<param name="class"></param> |
|||
<param name="parameter"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="T:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus"> |
|||
<summary> |
|||
CAP分布式事件总线 |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.AbpDistributedEventBusOptions"> |
|||
<summary> |
|||
Abp分布式事件总线配置 |
|||
</summary> |
|||
</member> |
|||
<member name="F:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CapPublisher"> |
|||
<summary> |
|||
CAP消息发布接口 |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CustomDistributedEventSubscriber"> |
|||
<summary> |
|||
自定义事件注册接口 |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.HandlerFactories"> |
|||
<summary> |
|||
本地事件处理器工厂对象集合 |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.EventTypes"> |
|||
<summary> |
|||
本地事件集合 |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CurrentUser"> |
|||
<summary> |
|||
当前用户 |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CurrentClient"> |
|||
<summary> |
|||
当前客户端 |
|||
</summary> |
|||
</member> |
|||
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CancellationTokenProvider"> |
|||
<summary> |
|||
取消令牌 |
|||
</summary> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,Microsoft.Extensions.Options.IOptions{Volo.Abp.EventBus.Distributed.AbpDistributedEventBusOptions},DotNetCore.CAP.ICapPublisher,Volo.Abp.Users.ICurrentUser,Volo.Abp.Clients.ICurrentClient,Volo.Abp.MultiTenancy.ICurrentTenant,Volo.Abp.EventBus.IEventErrorHandler,Volo.Abp.Threading.ICancellationTokenProvider,LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber)"> |
|||
<summary> |
|||
constructor |
|||
</summary> |
|||
<param name="serviceScopeFactory"></param> |
|||
<param name="distributedEventBusOptions"></param> |
|||
<param name="capPublisher"></param> |
|||
<param name="currentUser"></param> |
|||
<param name="currentClient"></param> |
|||
<param name="currentTenant"></param> |
|||
<param name="eventErrorHandler"></param> |
|||
<param name="cancellationTokenProvider"></param> |
|||
<param name="customDistributedEventSubscriber"></param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Subscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)"> |
|||
<summary> |
|||
订阅事件 |
|||
</summary> |
|||
<param name="eventType"></param> |
|||
<param name="factory"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Unsubscribe``1(System.Func{``0,System.Threading.Tasks.Task})"> |
|||
<summary> |
|||
退订事件 |
|||
</summary> |
|||
<typeparam name="TEvent">事件类型</typeparam> |
|||
<param name="action"></param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Unsubscribe(System.Type,Volo.Abp.EventBus.IEventHandler)"> |
|||
<summary> |
|||
退订事件 |
|||
</summary> |
|||
<param name="eventType">事件类型</param> |
|||
<param name="handler">事件处理器</param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Unsubscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)"> |
|||
<summary> |
|||
退订事件 |
|||
</summary> |
|||
<param name="eventType">事件类型</param> |
|||
<param name="factory">事件处理器工厂</param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.UnsubscribeAll(System.Type)"> |
|||
<summary> |
|||
退订所有事件 |
|||
</summary> |
|||
<param name="eventType">事件类型</param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Subscribe``1(Volo.Abp.EventBus.Distributed.IDistributedEventHandler{``0})"> |
|||
<summary> |
|||
订阅事件 |
|||
</summary> |
|||
<typeparam name="TEvent">事件类型</typeparam> |
|||
<param name="handler">事件处理器</param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.PublishAsync(System.Type,System.Object)"> |
|||
<summary> |
|||
发布事件 |
|||
</summary> |
|||
<param name="eventType">事件类型</param> |
|||
<param name="eventData">事件数据对象</param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.GetHandlerFactories(System.Type)"> |
|||
<summary> |
|||
获取事件处理器工厂列表 |
|||
</summary> |
|||
<param name="eventType"></param> |
|||
<returns></returns> |
|||
</member> |
|||
<member name="T:LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber"> |
|||
<summary> |
|||
自定义事件订阅者 |
|||
</summary> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber.Subscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)"> |
|||
<summary> |
|||
订阅事件 |
|||
</summary> |
|||
<param name="eventType"></param> |
|||
<param name="factory"></param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber.UnSubscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)"> |
|||
<summary> |
|||
取消订阅 |
|||
</summary> |
|||
<param name="eventType"></param> |
|||
<param name="factory"></param> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor.Execute(System.Object,System.Object[])"> |
|||
<summary> |
|||
Executes the configured method on <paramref name="target" />. This can be used whether or not |
|||
the configured method is asynchronous. |
|||
</summary> |
|||
<remarks> |
|||
Even if the target method is asynchronous, it's desirable to invoke it using Execute rather than |
|||
ExecuteAsync if you know at compile time what the return type is, because then you can directly |
|||
"await" that value (via a cast), and then the generated code will be able to reference the |
|||
resulting awaitable as a value-typed variable. If you use ExecuteAsync instead, the generated |
|||
code will have to treat the resulting awaitable as a boxed object, because it doesn't know at |
|||
compile time what type it would be. |
|||
</remarks> |
|||
<param name="target">The object whose method is to be executed.</param> |
|||
<param name="parameters">Parameters to pass to the method.</param> |
|||
<returns>The method return value.</returns> |
|||
</member> |
|||
<member name="M:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor.ExecuteAsync(System.Object,System.Object[])"> |
|||
<summary> |
|||
Executes the configured method on <paramref name="target" />. This can only be used if the configured |
|||
method is asynchronous. |
|||
</summary> |
|||
<remarks> |
|||
If you don't know at compile time the type of the method's returned awaitable, you can use ExecuteAsync, |
|||
which supplies an awaitable-of-object. This always works, but can incur several extra heap allocations |
|||
as compared with using Execute and then using "await" on the result value typecasted to the known |
|||
awaitable type. The possible extra heap allocations are for: |
|||
1. The custom awaitable (though usually there's a heap allocation for this anyway, since normally |
|||
it's a reference type, and you normally create a new instance per call). |
|||
2. The custom awaiter (whether or not it's a value type, since if it's not, you need a new instance |
|||
of it, and if it is, it will have to be boxed so the calling code can reference it as an object). |
|||
3. The async result value, if it's a value type (it has to be boxed as an object, since the calling |
|||
code doesn't know what type it's going to be). |
|||
</remarks> |
|||
<param name="target">The object whose method is to be executed.</param> |
|||
<param name="parameters">Parameters to pass to the method.</param> |
|||
<returns>An object that you can "await" to get the method return value.</returns> |
|||
</member> |
|||
<member name="T:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutorAwaitable"> |
|||
<summary> |
|||
Provides a common awaitable structure that <see cref="M:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor.ExecuteAsync(System.Object,System.Object[])" /> can |
|||
return, regardless of whether the underlying value is a System.Task, an FSharpAsync, or an |
|||
application-defined custom awaitable. |
|||
</summary> |
|||
</member> |
|||
<member name="T:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutorFSharpSupport"> |
|||
<summary> |
|||
Helper for detecting whether a given type is FSharpAsync`1, and if so, supplying |
|||
an <see cref="T:System.Linq.Expressions.Expression" /> for mapping instances of that type to a C# awaitable. |
|||
</summary> |
|||
<remarks> |
|||
The main design goal here is to avoid taking a compile-time dependency on |
|||
FSharp.Core.dll, because non-F# applications wouldn't use it. So all the references |
|||
to FSharp types have to be constructed dynamically at runtime. |
|||
</remarks> |
|||
</member> |
|||
<member name="T:Microsoft.Extensions.DependencyInjection.ServiceCollectionExtensions"> |
|||
<summary> |
|||
CAP ServiceCollectionExtensions |
|||
</summary> |
|||
</member> |
|||
<member name="M:Microsoft.Extensions.DependencyInjection.ServiceCollectionExtensions.AddCAPEventBus(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{DotNetCore.CAP.CapOptions})"> |
|||
<summary> |
|||
Adds and configures the consistence services for the consistency. |
|||
</summary> |
|||
<param name="services"></param> |
|||
<param name="capAction"></param> |
|||
<returns></returns> |
|||
</member> |
|||
</members> |
|||
</doc> |
|||
|
|||
@ -1,70 +1,71 @@ |
|||
using LINGYUN.Abp.IM.Messages; |
|||
using LINGYUN.Abp.IM.SignalR.Hubs; |
|||
using LINGYUN.Abp.RealTime.Client; |
|||
using Microsoft.AspNetCore.SignalR; |
|||
using Microsoft.Extensions.Logging; |
|||
using Microsoft.Extensions.Options; |
|||
using System; |
|||
using System.Collections.Immutable; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace LINGYUN.Abp.IM.SignalR.Messages |
|||
{ |
|||
public class SignalRMessageSenderProvider : MessageSenderProviderBase |
|||
{ |
|||
public override string Name => "SignalR"; |
|||
private readonly AbpIMSignalROptions _options; |
|||
|
|||
private readonly IOnlineClientManager _onlineClientManager; |
|||
|
|||
private readonly IHubContext<MessagesHub> _hubContext; |
|||
|
|||
public SignalRMessageSenderProvider( |
|||
IOnlineClientManager onlineClientManager, |
|||
IHubContext<MessagesHub> hubContext, |
|||
IServiceProvider serviceProvider, |
|||
IOptions<AbpIMSignalROptions> options) |
|||
: base(serviceProvider) |
|||
{ |
|||
_options = options.Value; |
|||
_hubContext = hubContext; |
|||
_onlineClientManager = onlineClientManager; |
|||
} |
|||
|
|||
protected override async Task SendMessageToGroupAsync(ChatMessage chatMessage) |
|||
{ |
|||
var signalRClient = _hubContext.Clients.Group(chatMessage.GroupId); |
|||
if (signalRClient == null) |
|||
{ |
|||
Logger.LogDebug("Can not get group " + chatMessage.GroupId + " from SignalR hub!"); |
|||
return; |
|||
} |
|||
|
|||
await signalRClient.SendAsync(_options.GetChatMessageMethod, chatMessage); |
|||
} |
|||
|
|||
protected override async Task SendMessageToUserAsync(ChatMessage chatMessage) |
|||
{ |
|||
try |
|||
{ |
|||
var onlineClientContext = new OnlineClientContext(chatMessage.TenantId, chatMessage.ToUserId.Value); |
|||
var onlineClients = _onlineClientManager.GetAllByContext(onlineClientContext); |
|||
|
|||
var onlineClientConnectionIds = onlineClients.Select(client => client.ConnectionId).ToImmutableArray(); |
|||
var signalRClients = _hubContext.Clients.Clients(onlineClientConnectionIds); |
|||
if (signalRClients == null) |
|||
{ |
|||
Logger.LogDebug("Can not get user " + onlineClientContext.UserId + " connection from SignalR hub!"); |
|||
return; |
|||
} |
|||
await signalRClients.SendAsync(_options.GetChatMessageMethod, chatMessage); |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
Logger.LogWarning("Could not send message to user: {0}", chatMessage.ToUserId); |
|||
Logger.LogWarning("Send to user message error: {0}", ex.Message); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
using LINGYUN.Abp.IM.Messages; |
|||
using LINGYUN.Abp.IM.SignalR.Hubs; |
|||
using LINGYUN.Abp.RealTime.Client; |
|||
using Microsoft.AspNetCore.SignalR; |
|||
using Microsoft.Extensions.Logging; |
|||
using Microsoft.Extensions.Options; |
|||
using System; |
|||
using System.Collections.Immutable; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace LINGYUN.Abp.IM.SignalR.Messages |
|||
{ |
|||
public class SignalRMessageSenderProvider : MessageSenderProviderBase |
|||
{ |
|||
public override string Name => "SignalR"; |
|||
private readonly AbpIMSignalROptions _options; |
|||
|
|||
private readonly IOnlineClientManager _onlineClientManager; |
|||
|
|||
private readonly IHubContext<MessagesHub> _hubContext; |
|||
|
|||
public SignalRMessageSenderProvider( |
|||
IOnlineClientManager onlineClientManager, |
|||
IHubContext<MessagesHub> hubContext, |
|||
IAbpLazyServiceProvider serviceProvider, |
|||
IOptions<AbpIMSignalROptions> options) |
|||
: base(serviceProvider) |
|||
{ |
|||
_options = options.Value; |
|||
_hubContext = hubContext; |
|||
_onlineClientManager = onlineClientManager; |
|||
} |
|||
|
|||
protected override async Task SendMessageToGroupAsync(ChatMessage chatMessage) |
|||
{ |
|||
var signalRClient = _hubContext.Clients.Group(chatMessage.GroupId); |
|||
if (signalRClient == null) |
|||
{ |
|||
Logger.LogDebug("Can not get group " + chatMessage.GroupId + " from SignalR hub!"); |
|||
return; |
|||
} |
|||
|
|||
await signalRClient.SendAsync(_options.GetChatMessageMethod, chatMessage); |
|||
} |
|||
|
|||
protected override async Task SendMessageToUserAsync(ChatMessage chatMessage) |
|||
{ |
|||
try |
|||
{ |
|||
var onlineClientContext = new OnlineClientContext(chatMessage.TenantId, chatMessage.ToUserId.Value); |
|||
var onlineClients = _onlineClientManager.GetAllByContext(onlineClientContext); |
|||
|
|||
var onlineClientConnectionIds = onlineClients.Select(client => client.ConnectionId).ToImmutableArray(); |
|||
var signalRClients = _hubContext.Clients.Clients(onlineClientConnectionIds); |
|||
if (signalRClients == null) |
|||
{ |
|||
Logger.LogDebug("Can not get user " + onlineClientContext.UserId + " connection from SignalR hub!"); |
|||
return; |
|||
} |
|||
await signalRClients.SendAsync(_options.GetChatMessageMethod, chatMessage); |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
Logger.LogWarning("Could not send message to user: {0}", chatMessage.ToUserId); |
|||
Logger.LogWarning("Send to user message error: {0}", ex.Message); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -1,15 +1,18 @@ |
|||
using LINGYUN.Abp.IM.Messages; |
|||
using Volo.Abp.Collections; |
|||
|
|||
namespace LINGYUN.Abp.IM |
|||
{ |
|||
public class AbpIMOptions |
|||
{ |
|||
public ITypeList<IMessageSenderProvider> Providers { get; } |
|||
|
|||
public AbpIMOptions() |
|||
{ |
|||
Providers = new TypeList<IMessageSenderProvider>(); |
|||
} |
|||
} |
|||
} |
|||
using LINGYUN.Abp.IM.Messages; |
|||
using Volo.Abp.Collections; |
|||
|
|||
namespace LINGYUN.Abp.IM |
|||
{ |
|||
public class AbpIMOptions |
|||
{ |
|||
/// <summary>
|
|||
/// 消息发送者
|
|||
/// </summary>
|
|||
public ITypeList<IMessageSenderProvider> Providers { get; } |
|||
|
|||
public AbpIMOptions() |
|||
{ |
|||
Providers = new TypeList<IMessageSenderProvider>(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,9 @@ |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace LINGYUN.Abp.IM.Messages |
|||
{ |
|||
public interface IMessageBlocker |
|||
{ |
|||
Task InterceptAsync(ChatMessage message); |
|||
} |
|||
} |
|||
@ -0,0 +1,45 @@ |
|||
namespace LINGYUN.Abp.IM.Messages |
|||
{ |
|||
public class MessageSendResult |
|||
{ |
|||
public bool Success { get; } |
|||
public string Error { get; } |
|||
public int Code { get; } |
|||
public string Form { get; } |
|||
public string To { get; } |
|||
public string Content { get; } |
|||
public static MessageSendResult Successed(string form, string to, string content) |
|||
{ |
|||
return new MessageSendResult(form, to, content); |
|||
} |
|||
|
|||
public static MessageSendResult Failed(int code, string error, string form, string to, string content) |
|||
{ |
|||
return new MessageSendResult(code, error, form, to, content); |
|||
} |
|||
private MessageSendResult( |
|||
int code, |
|||
string error, |
|||
string form, |
|||
string to, |
|||
string content) |
|||
{ |
|||
Code = code; |
|||
Error = error; |
|||
Form = form; |
|||
To = to; |
|||
Success = false; |
|||
} |
|||
|
|||
private MessageSendResult( |
|||
string form, |
|||
string to, |
|||
string content) |
|||
{ |
|||
Form = form; |
|||
To = to; |
|||
Content = content; |
|||
Success = true; |
|||
} |
|||
} |
|||
} |
|||
@ -1,70 +1,50 @@ |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Microsoft.Extensions.Logging; |
|||
using Microsoft.Extensions.Logging.Abstractions; |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace LINGYUN.Abp.IM.Messages |
|||
{ |
|||
public abstract class MessageSenderProviderBase : IMessageSenderProvider, ITransientDependency |
|||
{ |
|||
public abstract string Name { get; } |
|||
|
|||
protected IServiceProvider ServiceProvider { get; } |
|||
|
|||
protected readonly object ServiceProviderLock = new object(); |
|||
|
|||
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); |
|||
|
|||
protected TService LazyGetRequiredService<TService>(ref TService reference) |
|||
{ |
|||
if (reference == null) |
|||
{ |
|||
lock (ServiceProviderLock) |
|||
{ |
|||
if (reference == null) |
|||
{ |
|||
reference = ServiceProvider.GetRequiredService<TService>(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
return reference; |
|||
} |
|||
|
|||
protected MessageSenderProviderBase(IServiceProvider serviceProvider) |
|||
{ |
|||
ServiceProvider = serviceProvider; |
|||
} |
|||
|
|||
public virtual async Task SendMessageAsync(ChatMessage chatMessage) |
|||
{ |
|||
try |
|||
{ |
|||
if (!chatMessage.GroupId.IsNullOrWhiteSpace()) |
|||
{ |
|||
await SendMessageToGroupAsync(chatMessage); |
|||
} |
|||
else |
|||
{ |
|||
await SendMessageToUserAsync(chatMessage); |
|||
} |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
Logger.LogWarning("Could not send message, group: {0}, formUser: {1}, toUser: {2}", |
|||
chatMessage.GroupId, chatMessage.FormUserName, |
|||
chatMessage.ToUserId.HasValue ? chatMessage.ToUserId.ToString() : "None"); |
|||
Logger.LogWarning("Send group message error: {0}", ex.Message); |
|||
} |
|||
} |
|||
|
|||
protected abstract Task SendMessageToGroupAsync(ChatMessage chatMessage); |
|||
protected abstract Task SendMessageToUserAsync(ChatMessage chatMessage); |
|||
} |
|||
} |
|||
using Microsoft.Extensions.Logging; |
|||
using Microsoft.Extensions.Logging.Abstractions; |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace LINGYUN.Abp.IM.Messages |
|||
{ |
|||
public abstract class MessageSenderProviderBase : IMessageSenderProvider, ITransientDependency |
|||
{ |
|||
public abstract string Name { get; } |
|||
|
|||
protected IAbpLazyServiceProvider ServiceProvider { get; } |
|||
|
|||
protected ILoggerFactory LoggerFactory => ServiceProvider.LazyGetRequiredService<ILoggerFactory>(); |
|||
|
|||
protected ILogger Logger => _lazyLogger.Value; |
|||
private Lazy<ILogger> _lazyLogger => new Lazy<ILogger>(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true); |
|||
|
|||
protected MessageSenderProviderBase(IAbpLazyServiceProvider serviceProvider) |
|||
{ |
|||
ServiceProvider = serviceProvider; |
|||
} |
|||
|
|||
public virtual async Task SendMessageAsync(ChatMessage chatMessage) |
|||
{ |
|||
try |
|||
{ |
|||
if (!chatMessage.GroupId.IsNullOrWhiteSpace()) |
|||
{ |
|||
await SendMessageToGroupAsync(chatMessage); |
|||
} |
|||
else |
|||
{ |
|||
await SendMessageToUserAsync(chatMessage); |
|||
} |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
Logger.LogWarning("Could not send message, group: {0}, formUser: {1}, toUser: {2}", |
|||
chatMessage.GroupId, chatMessage.FormUserName, |
|||
chatMessage.ToUserId.HasValue ? chatMessage.ToUserId.ToString() : "None"); |
|||
Logger.LogWarning("Send group message error: {0}", ex.Message); |
|||
} |
|||
} |
|||
|
|||
protected abstract Task SendMessageToGroupAsync(ChatMessage chatMessage); |
|||
protected abstract Task SendMessageToUserAsync(ChatMessage chatMessage); |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,14 @@ |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace LINGYUN.Abp.IM.Messages |
|||
{ |
|||
[Dependency(TryRegister = true)] |
|||
public class NullMessageBlocker : IMessageBlocker, ISingletonDependency |
|||
{ |
|||
public Task InterceptAsync(ChatMessage message) |
|||
{ |
|||
return Task.CompletedTask; |
|||
} |
|||
} |
|||
} |
|||
@ -1,54 +1,52 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using Volo.Abp.Domain.Entities; |
|||
using Volo.Abp.MultiTenancy; |
|||
|
|||
namespace LINGYUN.Abp.MessageService.Chat |
|||
{ |
|||
public class UserChatSetting : Entity<long>, IMultiTenant |
|||
{ |
|||
/// <summary>
|
|||
/// 租户
|
|||
/// </summary>
|
|||
public virtual Guid? TenantId { get; protected set; } |
|||
/// <summary>
|
|||
/// 用户标识
|
|||
/// </summary>
|
|||
public virtual Guid UserId { get; protected set; } |
|||
/// <summary>
|
|||
/// 允许匿名聊天
|
|||
/// </summary>
|
|||
public virtual bool AllowAnonymous { get; set; } |
|||
/// <summary>
|
|||
/// 允许添加好友
|
|||
/// </summary>
|
|||
public virtual bool AllowAddFriend { get; set; } |
|||
/// <summary>
|
|||
/// 添加好友需要验证
|
|||
/// </summary>
|
|||
public virtual bool RequireAddFriendValition { get; set; } |
|||
/// <summary>
|
|||
/// 允许接收消息
|
|||
/// </summary>
|
|||
public virtual bool AllowReceiveMessage { get; set; } |
|||
/// <summary>
|
|||
/// 允许发送消息
|
|||
/// </summary>
|
|||
public virtual bool AllowSendMessage { get; set; } |
|||
protected UserChatSetting() |
|||
{ |
|||
} |
|||
public UserChatSetting(Guid userId, Guid? tenantId) |
|||
: this() |
|||
{ |
|||
UserId = userId; |
|||
TenantId = tenantId; |
|||
AllowAnonymous = false; |
|||
AllowAddFriend = true; |
|||
AllowReceiveMessage = true; |
|||
AllowSendMessage = true; |
|||
RequireAddFriendValition = true; |
|||
} |
|||
} |
|||
} |
|||
using System; |
|||
using Volo.Abp.Domain.Entities; |
|||
using Volo.Abp.MultiTenancy; |
|||
|
|||
namespace LINGYUN.Abp.MessageService.Chat |
|||
{ |
|||
public class UserChatSetting : Entity<long>, IMultiTenant |
|||
{ |
|||
/// <summary>
|
|||
/// 租户
|
|||
/// </summary>
|
|||
public virtual Guid? TenantId { get; protected set; } |
|||
/// <summary>
|
|||
/// 用户标识
|
|||
/// </summary>
|
|||
public virtual Guid UserId { get; protected set; } |
|||
/// <summary>
|
|||
/// 允许匿名聊天
|
|||
/// </summary>
|
|||
public virtual bool AllowAnonymous { get; set; } |
|||
/// <summary>
|
|||
/// 允许添加好友
|
|||
/// </summary>
|
|||
public virtual bool AllowAddFriend { get; set; } |
|||
/// <summary>
|
|||
/// 添加好友需要验证
|
|||
/// </summary>
|
|||
public virtual bool RequireAddFriendValition { get; set; } |
|||
/// <summary>
|
|||
/// 允许接收消息
|
|||
/// </summary>
|
|||
public virtual bool AllowReceiveMessage { get; set; } |
|||
/// <summary>
|
|||
/// 允许发送消息
|
|||
/// </summary>
|
|||
public virtual bool AllowSendMessage { get; set; } |
|||
protected UserChatSetting() |
|||
{ |
|||
} |
|||
public UserChatSetting(Guid userId, Guid? tenantId) |
|||
: this() |
|||
{ |
|||
UserId = userId; |
|||
TenantId = tenantId; |
|||
AllowAnonymous = false; |
|||
AllowAddFriend = true; |
|||
AllowReceiveMessage = true; |
|||
AllowSendMessage = true; |
|||
RequireAddFriendValition = true; |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -1,377 +1,389 @@ |
|||
using Microsoft.AspNetCore.Authorization; |
|||
using Microsoft.Extensions.Options; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.Account.Settings; |
|||
using Volo.Abp.Application.Dtos; |
|||
using Volo.Abp.Application.Services; |
|||
using Volo.Abp.Caching; |
|||
using Volo.Abp.Emailing; |
|||
using Volo.Abp.Identity.Settings; |
|||
using Volo.Abp.Localization; |
|||
using Volo.Abp.MultiTenancy; |
|||
using Volo.Abp.SettingManagement; |
|||
using Volo.Abp.SettingManagement.Localization; |
|||
using Volo.Abp.Settings; |
|||
using Volo.Abp.Timing; |
|||
using Volo.Abp.Users; |
|||
using Volo.Abp.EventBus.Distributed; |
|||
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; |
|||
|
|||
namespace LINGYUN.Abp.SettingManagement |
|||
{ |
|||
[Authorize(AbpSettingManagementPermissions.Settings.Default)] |
|||
public class SettingAppService : ApplicationService, ISettingAppService |
|||
{ |
|||
protected AbpLocalizationOptions LocalizationOptions { get; } |
|||
|
|||
protected IDistributedEventBus EventBus { get; } |
|||
protected ISettingManager SettingManager { get; } |
|||
protected ISettingDefinitionManager SettingDefinitionManager { get; } |
|||
|
|||
protected IDistributedCache<SettingCacheItem> Cache { get; } |
|||
public SettingAppService( |
|||
IDistributedEventBus eventBus, |
|||
ISettingManager settingManager, |
|||
IDistributedCache<SettingCacheItem> cache, |
|||
IOptions<AbpLocalizationOptions> localizationOptions, |
|||
ISettingDefinitionManager settingDefinitionManager) |
|||
{ |
|||
Cache = cache; |
|||
EventBus = eventBus; |
|||
SettingManager = settingManager; |
|||
SettingDefinitionManager = settingDefinitionManager; |
|||
LocalizationOptions = localizationOptions.Value; |
|||
LocalizationResource = typeof(AbpSettingManagementResource); |
|||
} |
|||
|
|||
[Authorize(AbpSettingManagementPermissions.Settings.Manager)] |
|||
public virtual async Task SetGlobalAsync(UpdateSettingsDto input) |
|||
{ |
|||
foreach (var setting in input.Settings) |
|||
{ |
|||
await SettingManager.SetGlobalAsync(setting.Name, setting.Value); |
|||
} |
|||
|
|||
CurrentUnitOfWork.OnCompleted(async () => |
|||
{ |
|||
// 发送刷新用户缓存事件
|
|||
await EventBus.PublishAsync(new CurrentApplicationConfigurationCacheResetEventData()); |
|||
}); |
|||
|
|||
await CurrentUnitOfWork.SaveChangesAsync(); |
|||
} |
|||
|
|||
[Authorize(AbpSettingManagementPermissions.Settings.Manager)] |
|||
public virtual async Task SetCurrentTenantAsync(UpdateSettingsDto input) |
|||
{ |
|||
if (CurrentTenant.IsAvailable) |
|||
{ |
|||
foreach (var setting in input.Settings) |
|||
{ |
|||
await SettingManager.SetForTenantAsync(CurrentTenant.GetId(), setting.Name, setting.Value); |
|||
} |
|||
|
|||
CurrentUnitOfWork.OnCompleted(async () => |
|||
{ |
|||
// 发送刷新用户缓存事件
|
|||
await EventBus.PublishAsync(new CurrentApplicationConfigurationCacheResetEventData()); |
|||
}); |
|||
|
|||
await CurrentUnitOfWork.SaveChangesAsync(); |
|||
} |
|||
} |
|||
|
|||
//[Authorize]
|
|||
[AllowAnonymous] |
|||
public virtual async Task<ListResultDto<SettingGroupDto>> GetAllForCurrentTenantAsync() |
|||
{ |
|||
return await GetAllForProviderAsync(TenantSettingValueProvider.ProviderName, CurrentTenant.GetId().ToString()); |
|||
} |
|||
|
|||
[AllowAnonymous] |
|||
public virtual async Task<ListResultDto<SettingGroupDto>> GetAllForGlobalAsync() |
|||
{ |
|||
return await GetAllForProviderAsync(GlobalSettingValueProvider.ProviderName, null); |
|||
} |
|||
|
|||
protected virtual async Task<ListResultDto<SettingGroupDto>> GetAllForProviderAsync(string providerName, string providerKey) |
|||
{ |
|||
/* |
|||
* 2020-11-19 |
|||
* colin@foxmail.com |
|||
* |
|||
* 之所以重构为这种看似硬编码的设计,是因为硬编码的都是常用的自带的配置 |
|||
* |
|||
* 自定义的应用模块可以实现返回相同Dto的配置服务,然后通过路由的聚合功能, |
|||
* 轻松加入到前端的设置管理(因为vue前端已设计为动态表单页面) |
|||
* |
|||
* 最初的设计才是不合理的,前端不能硬编码设置管理界面,这应该是后端的事情 |
|||
*/ |
|||
|
|||
var settingGroups = new List<SettingGroupDto>(); |
|||
|
|||
#region 系统设置
|
|||
|
|||
var sysSettingGroup = new SettingGroupDto(L["DisplayName:System"], L["Description:System"]); |
|||
// 语言
|
|||
var languageSetting = sysSettingGroup.AddSetting(L["DisplayName:System.Language"], L["Description:System.Language"]); |
|||
languageSetting.AddDetail( |
|||
SettingDefinitionManager.Get(LocalizationSettingNames.DefaultLanguage), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage, providerName, providerKey), |
|||
ValueType.Option) |
|||
.AddOptions(LocalizationOptions.Languages.Select(l => new OptionDto(l.DisplayName, l.CultureName))); |
|||
// 时区
|
|||
var timingSetting = sysSettingGroup.AddSetting(L["DisplayName:System.Timing"], L["Description:System.Timing"]); |
|||
timingSetting.AddDetail( |
|||
SettingDefinitionManager.Get(TimingSettingNames.TimeZone), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(TimingSettingNames.TimeZone, providerName, providerKey), |
|||
ValueType.String); |
|||
settingGroups.Add(sysSettingGroup); |
|||
|
|||
#endregion
|
|||
|
|||
#region 安全设置
|
|||
|
|||
var securitySettingGroup = new SettingGroupDto(L["DisplayName:Security"], L["Description:Security"]); |
|||
|
|||
// 用户账户
|
|||
var accountSetting = securitySettingGroup.AddSetting(L["DisplayName:Security.Account"], L["Description:Security.Account"]); |
|||
// 启用本地登录
|
|||
accountSetting.AddDetail( |
|||
SettingDefinitionManager.Get(AccountSettingNames.EnableLocalLogin), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(AccountSettingNames.EnableLocalLogin, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
accountSetting.AddDetail( |
|||
SettingDefinitionManager.Get(AccountSettingNames.IsSelfRegistrationEnabled), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(AccountSettingNames.IsSelfRegistrationEnabled, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
|
|||
settingGroups.Add(securitySettingGroup); |
|||
|
|||
#endregion
|
|||
|
|||
#region 身份标识设置
|
|||
|
|||
// 身份标识设置
|
|||
var identitySetting = new SettingGroupDto(L["DisplayName:Identity"], L["Description:Identity"]); |
|||
|
|||
#region 用户锁定
|
|||
|
|||
var lockoutSetting = identitySetting.AddSetting(L["DisplayName:Identity.Lockout"], L["Description:Identity.Lockout"]); |
|||
lockoutSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.Lockout.AllowedForNewUsers), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.AllowedForNewUsers, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
lockoutSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.Lockout.LockoutDuration), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.LockoutDuration, providerName, providerKey), |
|||
ValueType.Number); |
|||
lockoutSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.Lockout.MaxFailedAccessAttempts), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.MaxFailedAccessAttempts, providerName, providerKey), |
|||
ValueType.Number); |
|||
|
|||
#endregion
|
|||
|
|||
#region 用户
|
|||
|
|||
var userSetting = identitySetting.AddSetting(L["DisplayName:Identity.User"], L["Description:Identity.User"]); |
|||
userSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.User.IsEmailUpdateEnabled), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsEmailUpdateEnabled, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
userSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.User.IsUserNameUpdateEnabled), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsUserNameUpdateEnabled, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
userSetting.AddDetail( |
|||
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsNewUserRegister), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsNewUserRegister, providerName, providerKey), |
|||
ValueType.String); |
|||
userSetting.AddDetail( |
|||
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsResetPassword), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsResetPassword, providerName, providerKey), |
|||
ValueType.String); |
|||
userSetting.AddDetail( |
|||
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsUserSignin), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsUserSignin, providerName, providerKey), |
|||
ValueType.String); |
|||
userSetting.AddDetail( |
|||
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsPhoneNumberConfirmed), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsPhoneNumberConfirmed, providerName, providerKey), |
|||
ValueType.String); |
|||
userSetting.AddDetail( |
|||
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsRepetInterval), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsRepetInterval, providerName, providerKey), |
|||
ValueType.Number); |
|||
|
|||
#endregion
|
|||
|
|||
#region 登录
|
|||
|
|||
var signinSetting = identitySetting.AddSetting(L["DisplayName:Identity.SignIn"], L["Description:Identity.SignIn"]); |
|||
signinSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.SignIn.EnablePhoneNumberConfirmation), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.EnablePhoneNumberConfirmation, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
signinSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.SignIn.RequireConfirmedEmail), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.RequireConfirmedEmail, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
signinSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
|
|||
#endregion
|
|||
|
|||
#region 密码
|
|||
|
|||
var passwordSetting = identitySetting.AddSetting(L["DisplayName:Identity.Password"], L["Description:Identity.Password"]); |
|||
passwordSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireDigit), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireDigit, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
passwordSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequiredLength), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequiredLength, providerName, providerKey), |
|||
ValueType.Number); |
|||
passwordSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequiredUniqueChars), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequiredUniqueChars, providerName, providerKey), |
|||
ValueType.Number); |
|||
passwordSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireLowercase), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireLowercase, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
passwordSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireUppercase), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireUppercase, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
passwordSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireNonAlphanumeric), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireNonAlphanumeric, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
|
|||
#endregion
|
|||
|
|||
#region 双因素
|
|||
|
|||
// Removed See: https://github.com/abpframework/abp/pull/7719
|
|||
//var twoFactorSetting = identitySetting.AddSetting(L["DisplayName:Identity.TwoFactor"], L["Description:Identity.TwoFactor"]);
|
|||
//twoFactorSetting.AddDetail(
|
|||
// SettingDefinitionManager.Get(IdentitySettingNames.TwoFactor.Behaviour),
|
|||
// StringLocalizerFactory,
|
|||
// await SettingManager.GetOrNullAsync(IdentitySettingNames.TwoFactor.Behaviour, providerName, providerKey),
|
|||
// ValueType.Option)
|
|||
// .AddOption(IdentityTwoFactorBehaviour.Optional.ToString(), IdentityTwoFactorBehaviour.Optional.ToString())
|
|||
// .AddOption(IdentityTwoFactorBehaviour.Forced.ToString(), IdentityTwoFactorBehaviour.Forced.ToString())
|
|||
// .AddOption(IdentityTwoFactorBehaviour.Disabled.ToString(), IdentityTwoFactorBehaviour.Disabled.ToString());
|
|||
//twoFactorSetting.AddDetail(
|
|||
// SettingDefinitionManager.Get(IdentitySettingNames.TwoFactor.UsersCanChange),
|
|||
// StringLocalizerFactory,
|
|||
// await SettingManager.GetOrNullAsync(IdentitySettingNames.TwoFactor.UsersCanChange, providerName, providerKey),
|
|||
// ValueType.Boolean);
|
|||
|
|||
#endregion
|
|||
|
|||
#region 组织机构
|
|||
|
|||
var ouSetting = identitySetting.AddSetting(L["DisplayName:Identity.OrganizationUnit"], L["Description:Identity.OrganizationUnit"]); |
|||
ouSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.OrganizationUnit.MaxUserMembershipCount), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.OrganizationUnit.MaxUserMembershipCount, providerName, providerKey), |
|||
ValueType.Number); |
|||
|
|||
settingGroups.Add(identitySetting); |
|||
|
|||
#endregion
|
|||
|
|||
#endregion
|
|||
|
|||
#region 邮件设置
|
|||
|
|||
var emailSettingGroup = new SettingGroupDto(L["DisplayName:Emailing"], L["Description:Emailing"]); |
|||
var defaultMailSetting = emailSettingGroup.AddSetting(L["DisplayName:Emailing.Default"], L["Description:Emailing.Default"]); |
|||
defaultMailSetting.AddDetail( |
|||
SettingDefinitionManager.Get(EmailSettingNames.DefaultFromAddress), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(EmailSettingNames.DefaultFromAddress, providerName, providerKey), |
|||
ValueType.String); |
|||
defaultMailSetting.AddDetail( |
|||
SettingDefinitionManager.Get(EmailSettingNames.DefaultFromDisplayName), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(EmailSettingNames.DefaultFromDisplayName, providerName, providerKey), |
|||
ValueType.String); |
|||
|
|||
var smtpSetting = emailSettingGroup.AddSetting(L["DisplayName:Emailing.Smtp"], L["Description:Emailing.Smtp"]); |
|||
smtpSetting.AddDetail( |
|||
SettingDefinitionManager.Get(EmailSettingNames.Smtp.EnableSsl), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.EnableSsl, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
smtpSetting.AddDetail( |
|||
SettingDefinitionManager.Get(EmailSettingNames.Smtp.UseDefaultCredentials), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.UseDefaultCredentials, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
smtpSetting.AddDetail( |
|||
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Domain), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Domain, providerName, providerKey), |
|||
ValueType.String); |
|||
smtpSetting.AddDetail( |
|||
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Host), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Host, providerName, providerKey), |
|||
ValueType.String); |
|||
smtpSetting.AddDetail( |
|||
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Port), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Port, providerName, providerKey), |
|||
ValueType.Number); |
|||
smtpSetting.AddDetail( |
|||
SettingDefinitionManager.Get(EmailSettingNames.Smtp.UserName), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.UserName, providerName, providerKey), |
|||
ValueType.String); |
|||
smtpSetting.AddDetail( |
|||
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Password), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Password, providerName, providerKey), |
|||
ValueType.String); |
|||
|
|||
settingGroups.Add(emailSettingGroup); |
|||
|
|||
#endregion
|
|||
|
|||
return new ListResultDto<SettingGroupDto>(settingGroups); |
|||
} |
|||
} |
|||
} |
|||
using Microsoft.AspNetCore.Authorization; |
|||
using Microsoft.Extensions.Options; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.Account.Settings; |
|||
using Volo.Abp.Application.Dtos; |
|||
using Volo.Abp.Application.Services; |
|||
using Volo.Abp.Caching; |
|||
using Volo.Abp.Emailing; |
|||
using Volo.Abp.Identity.Settings; |
|||
using Volo.Abp.Localization; |
|||
using Volo.Abp.MultiTenancy; |
|||
using Volo.Abp.SettingManagement; |
|||
using Volo.Abp.SettingManagement.Localization; |
|||
using Volo.Abp.Settings; |
|||
using Volo.Abp.Timing; |
|||
using Volo.Abp.Users; |
|||
using Volo.Abp.EventBus.Distributed; |
|||
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; |
|||
using Volo.Abp.Features; |
|||
|
|||
namespace LINGYUN.Abp.SettingManagement |
|||
{ |
|||
[Authorize(AbpSettingManagementPermissions.Settings.Default)] |
|||
public class SettingAppService : ApplicationService, ISettingAppService |
|||
{ |
|||
protected AbpLocalizationOptions LocalizationOptions { get; } |
|||
|
|||
protected IDistributedEventBus EventBus { get; } |
|||
protected ISettingManager SettingManager { get; } |
|||
protected ISettingDefinitionManager SettingDefinitionManager { get; } |
|||
|
|||
protected IDistributedCache<SettingCacheItem> Cache { get; } |
|||
public SettingAppService( |
|||
IDistributedEventBus eventBus, |
|||
ISettingManager settingManager, |
|||
IDistributedCache<SettingCacheItem> cache, |
|||
IOptions<AbpLocalizationOptions> localizationOptions, |
|||
ISettingDefinitionManager settingDefinitionManager) |
|||
{ |
|||
Cache = cache; |
|||
EventBus = eventBus; |
|||
SettingManager = settingManager; |
|||
SettingDefinitionManager = settingDefinitionManager; |
|||
LocalizationOptions = localizationOptions.Value; |
|||
LocalizationResource = typeof(AbpSettingManagementResource); |
|||
} |
|||
|
|||
[Authorize(AbpSettingManagementPermissions.Settings.Manager)] |
|||
public virtual async Task SetGlobalAsync(UpdateSettingsDto input) |
|||
{ |
|||
// 增加特性检查
|
|||
await CheckFeatureAsync(); |
|||
|
|||
foreach (var setting in input.Settings) |
|||
{ |
|||
await SettingManager.SetGlobalAsync(setting.Name, setting.Value); |
|||
} |
|||
|
|||
CurrentUnitOfWork.OnCompleted(async () => |
|||
{ |
|||
// 发送刷新用户缓存事件
|
|||
await EventBus.PublishAsync(new CurrentApplicationConfigurationCacheResetEventData()); |
|||
}); |
|||
|
|||
await CurrentUnitOfWork.SaveChangesAsync(); |
|||
} |
|||
|
|||
[Authorize(AbpSettingManagementPermissions.Settings.Manager)] |
|||
public virtual async Task SetCurrentTenantAsync(UpdateSettingsDto input) |
|||
{ |
|||
// 增加特性检查
|
|||
await CheckFeatureAsync(); |
|||
|
|||
if (CurrentTenant.IsAvailable) |
|||
{ |
|||
foreach (var setting in input.Settings) |
|||
{ |
|||
await SettingManager.SetForTenantAsync(CurrentTenant.GetId(), setting.Name, setting.Value); |
|||
} |
|||
|
|||
CurrentUnitOfWork.OnCompleted(async () => |
|||
{ |
|||
// 发送刷新用户缓存事件
|
|||
await EventBus.PublishAsync(new CurrentApplicationConfigurationCacheResetEventData()); |
|||
}); |
|||
|
|||
await CurrentUnitOfWork.SaveChangesAsync(); |
|||
} |
|||
} |
|||
|
|||
//[Authorize]
|
|||
[AllowAnonymous] |
|||
public virtual async Task<ListResultDto<SettingGroupDto>> GetAllForCurrentTenantAsync() |
|||
{ |
|||
return await GetAllForProviderAsync(TenantSettingValueProvider.ProviderName, CurrentTenant.GetId().ToString()); |
|||
} |
|||
|
|||
[AllowAnonymous] |
|||
public virtual async Task<ListResultDto<SettingGroupDto>> GetAllForGlobalAsync() |
|||
{ |
|||
return await GetAllForProviderAsync(GlobalSettingValueProvider.ProviderName, null); |
|||
} |
|||
|
|||
protected virtual async Task<ListResultDto<SettingGroupDto>> GetAllForProviderAsync(string providerName, string providerKey) |
|||
{ |
|||
/* |
|||
* 2020-11-19 |
|||
* colin@foxmail.com |
|||
* |
|||
* 之所以重构为这种看似硬编码的设计,是因为硬编码的都是常用的自带的配置 |
|||
* |
|||
* 自定义的应用模块可以实现返回相同Dto的配置服务,然后通过路由的聚合功能, |
|||
* 轻松加入到前端的设置管理(因为vue前端已设计为动态表单页面) |
|||
* |
|||
* 最初的设计才是不合理的,前端不能硬编码设置管理界面,这应该是后端的事情 |
|||
*/ |
|||
|
|||
var settingGroups = new List<SettingGroupDto>(); |
|||
|
|||
#region 系统设置
|
|||
|
|||
var sysSettingGroup = new SettingGroupDto(L["DisplayName:System"], L["Description:System"]); |
|||
// 语言
|
|||
var languageSetting = sysSettingGroup.AddSetting(L["DisplayName:System.Language"], L["Description:System.Language"]); |
|||
languageSetting.AddDetail( |
|||
SettingDefinitionManager.Get(LocalizationSettingNames.DefaultLanguage), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage, providerName, providerKey), |
|||
ValueType.Option) |
|||
.AddOptions(LocalizationOptions.Languages.Select(l => new OptionDto(l.DisplayName, l.CultureName))); |
|||
// 时区
|
|||
var timingSetting = sysSettingGroup.AddSetting(L["DisplayName:System.Timing"], L["Description:System.Timing"]); |
|||
timingSetting.AddDetail( |
|||
SettingDefinitionManager.Get(TimingSettingNames.TimeZone), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(TimingSettingNames.TimeZone, providerName, providerKey), |
|||
ValueType.String); |
|||
settingGroups.Add(sysSettingGroup); |
|||
|
|||
#endregion
|
|||
|
|||
#region 安全设置
|
|||
|
|||
var securitySettingGroup = new SettingGroupDto(L["DisplayName:Security"], L["Description:Security"]); |
|||
|
|||
// 用户账户
|
|||
var accountSetting = securitySettingGroup.AddSetting(L["DisplayName:Security.Account"], L["Description:Security.Account"]); |
|||
// 启用本地登录
|
|||
accountSetting.AddDetail( |
|||
SettingDefinitionManager.Get(AccountSettingNames.EnableLocalLogin), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(AccountSettingNames.EnableLocalLogin, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
accountSetting.AddDetail( |
|||
SettingDefinitionManager.Get(AccountSettingNames.IsSelfRegistrationEnabled), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(AccountSettingNames.IsSelfRegistrationEnabled, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
|
|||
settingGroups.Add(securitySettingGroup); |
|||
|
|||
#endregion
|
|||
|
|||
#region 身份标识设置
|
|||
|
|||
// 身份标识设置
|
|||
var identitySetting = new SettingGroupDto(L["DisplayName:Identity"], L["Description:Identity"]); |
|||
|
|||
#region 用户锁定
|
|||
|
|||
var lockoutSetting = identitySetting.AddSetting(L["DisplayName:Identity.Lockout"], L["Description:Identity.Lockout"]); |
|||
lockoutSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.Lockout.AllowedForNewUsers), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.AllowedForNewUsers, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
lockoutSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.Lockout.LockoutDuration), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.LockoutDuration, providerName, providerKey), |
|||
ValueType.Number); |
|||
lockoutSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.Lockout.MaxFailedAccessAttempts), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.MaxFailedAccessAttempts, providerName, providerKey), |
|||
ValueType.Number); |
|||
|
|||
#endregion
|
|||
|
|||
#region 用户
|
|||
|
|||
var userSetting = identitySetting.AddSetting(L["DisplayName:Identity.User"], L["Description:Identity.User"]); |
|||
userSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.User.IsEmailUpdateEnabled), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsEmailUpdateEnabled, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
userSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.User.IsUserNameUpdateEnabled), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsUserNameUpdateEnabled, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
userSetting.AddDetail( |
|||
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsNewUserRegister), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsNewUserRegister, providerName, providerKey), |
|||
ValueType.String); |
|||
userSetting.AddDetail( |
|||
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsResetPassword), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsResetPassword, providerName, providerKey), |
|||
ValueType.String); |
|||
userSetting.AddDetail( |
|||
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsUserSignin), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsUserSignin, providerName, providerKey), |
|||
ValueType.String); |
|||
userSetting.AddDetail( |
|||
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsPhoneNumberConfirmed), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsPhoneNumberConfirmed, providerName, providerKey), |
|||
ValueType.String); |
|||
userSetting.AddDetail( |
|||
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsRepetInterval), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsRepetInterval, providerName, providerKey), |
|||
ValueType.Number); |
|||
|
|||
#endregion
|
|||
|
|||
#region 登录
|
|||
|
|||
var signinSetting = identitySetting.AddSetting(L["DisplayName:Identity.SignIn"], L["Description:Identity.SignIn"]); |
|||
signinSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.SignIn.EnablePhoneNumberConfirmation), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.EnablePhoneNumberConfirmation, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
signinSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.SignIn.RequireConfirmedEmail), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.RequireConfirmedEmail, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
signinSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
|
|||
#endregion
|
|||
|
|||
#region 密码
|
|||
|
|||
var passwordSetting = identitySetting.AddSetting(L["DisplayName:Identity.Password"], L["Description:Identity.Password"]); |
|||
passwordSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireDigit), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireDigit, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
passwordSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequiredLength), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequiredLength, providerName, providerKey), |
|||
ValueType.Number); |
|||
passwordSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequiredUniqueChars), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequiredUniqueChars, providerName, providerKey), |
|||
ValueType.Number); |
|||
passwordSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireLowercase), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireLowercase, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
passwordSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireUppercase), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireUppercase, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
passwordSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireNonAlphanumeric), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireNonAlphanumeric, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
|
|||
#endregion
|
|||
|
|||
#region 双因素
|
|||
|
|||
// Removed See: https://github.com/abpframework/abp/pull/7719
|
|||
//var twoFactorSetting = identitySetting.AddSetting(L["DisplayName:Identity.TwoFactor"], L["Description:Identity.TwoFactor"]);
|
|||
//twoFactorSetting.AddDetail(
|
|||
// SettingDefinitionManager.Get(IdentitySettingNames.TwoFactor.Behaviour),
|
|||
// StringLocalizerFactory,
|
|||
// await SettingManager.GetOrNullAsync(IdentitySettingNames.TwoFactor.Behaviour, providerName, providerKey),
|
|||
// ValueType.Option)
|
|||
// .AddOption(IdentityTwoFactorBehaviour.Optional.ToString(), IdentityTwoFactorBehaviour.Optional.ToString())
|
|||
// .AddOption(IdentityTwoFactorBehaviour.Forced.ToString(), IdentityTwoFactorBehaviour.Forced.ToString())
|
|||
// .AddOption(IdentityTwoFactorBehaviour.Disabled.ToString(), IdentityTwoFactorBehaviour.Disabled.ToString());
|
|||
//twoFactorSetting.AddDetail(
|
|||
// SettingDefinitionManager.Get(IdentitySettingNames.TwoFactor.UsersCanChange),
|
|||
// StringLocalizerFactory,
|
|||
// await SettingManager.GetOrNullAsync(IdentitySettingNames.TwoFactor.UsersCanChange, providerName, providerKey),
|
|||
// ValueType.Boolean);
|
|||
|
|||
#endregion
|
|||
|
|||
#region 组织机构
|
|||
|
|||
var ouSetting = identitySetting.AddSetting(L["DisplayName:Identity.OrganizationUnit"], L["Description:Identity.OrganizationUnit"]); |
|||
ouSetting.AddDetail( |
|||
SettingDefinitionManager.Get(IdentitySettingNames.OrganizationUnit.MaxUserMembershipCount), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(IdentitySettingNames.OrganizationUnit.MaxUserMembershipCount, providerName, providerKey), |
|||
ValueType.Number); |
|||
|
|||
settingGroups.Add(identitySetting); |
|||
|
|||
#endregion
|
|||
|
|||
#endregion
|
|||
|
|||
#region 邮件设置
|
|||
|
|||
var emailSettingGroup = new SettingGroupDto(L["DisplayName:Emailing"], L["Description:Emailing"]); |
|||
var defaultMailSetting = emailSettingGroup.AddSetting(L["DisplayName:Emailing.Default"], L["Description:Emailing.Default"]); |
|||
defaultMailSetting.AddDetail( |
|||
SettingDefinitionManager.Get(EmailSettingNames.DefaultFromAddress), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(EmailSettingNames.DefaultFromAddress, providerName, providerKey), |
|||
ValueType.String); |
|||
defaultMailSetting.AddDetail( |
|||
SettingDefinitionManager.Get(EmailSettingNames.DefaultFromDisplayName), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(EmailSettingNames.DefaultFromDisplayName, providerName, providerKey), |
|||
ValueType.String); |
|||
|
|||
var smtpSetting = emailSettingGroup.AddSetting(L["DisplayName:Emailing.Smtp"], L["Description:Emailing.Smtp"]); |
|||
smtpSetting.AddDetail( |
|||
SettingDefinitionManager.Get(EmailSettingNames.Smtp.EnableSsl), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.EnableSsl, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
smtpSetting.AddDetail( |
|||
SettingDefinitionManager.Get(EmailSettingNames.Smtp.UseDefaultCredentials), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.UseDefaultCredentials, providerName, providerKey), |
|||
ValueType.Boolean); |
|||
smtpSetting.AddDetail( |
|||
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Domain), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Domain, providerName, providerKey), |
|||
ValueType.String); |
|||
smtpSetting.AddDetail( |
|||
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Host), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Host, providerName, providerKey), |
|||
ValueType.String); |
|||
smtpSetting.AddDetail( |
|||
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Port), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Port, providerName, providerKey), |
|||
ValueType.Number); |
|||
smtpSetting.AddDetail( |
|||
SettingDefinitionManager.Get(EmailSettingNames.Smtp.UserName), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.UserName, providerName, providerKey), |
|||
ValueType.String); |
|||
smtpSetting.AddDetail( |
|||
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Password), |
|||
StringLocalizerFactory, |
|||
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Password, providerName, providerKey), |
|||
ValueType.String); |
|||
|
|||
settingGroups.Add(emailSettingGroup); |
|||
|
|||
#endregion
|
|||
|
|||
return new ListResultDto<SettingGroupDto>(settingGroups); |
|||
} |
|||
|
|||
protected virtual async Task CheckFeatureAsync() |
|||
{ |
|||
await FeatureChecker.CheckEnabledAsync(SettingManagementFeatures.Enable); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -1,53 +1,61 @@ |
|||
using LINGYUN.Abp.IM; |
|||
using LINGYUN.Abp.IM.Messages; |
|||
using LINGYUN.Abp.RealTime; |
|||
using Microsoft.Extensions.Logging; |
|||
using Microsoft.Extensions.Logging.Abstractions; |
|||
using Microsoft.Extensions.Options; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.EventBus.Distributed; |
|||
|
|||
namespace LINGYUN.Abp.MessageService.EventBus.Distributed |
|||
{ |
|||
public class ChatMessageEventHandler : IDistributedEventHandler<RealTimeEto<ChatMessage>>, ITransientDependency |
|||
{ |
|||
/// <summary>
|
|||
/// Reference to <see cref="ILogger<DefaultNotificationDispatcher>"/>.
|
|||
/// </summary>
|
|||
public ILogger<ChatMessageEventHandler> Logger { get; set; } |
|||
/// <summary>
|
|||
/// Reference to <see cref="AbpIMOptions"/>.
|
|||
/// </summary>
|
|||
protected AbpIMOptions Options { get; } |
|||
|
|||
protected IMessageStore MessageStore { get; } |
|||
protected IMessageSenderProviderManager MessageSenderProviderManager { get; } |
|||
|
|||
public ChatMessageEventHandler( |
|||
IOptions<AbpIMOptions> options, |
|||
IMessageStore messageStore, |
|||
IMessageSenderProviderManager messageSenderProviderManager) |
|||
{ |
|||
Options = options.Value; |
|||
MessageStore = messageStore; |
|||
MessageSenderProviderManager = messageSenderProviderManager; |
|||
|
|||
Logger = NullLogger<ChatMessageEventHandler>.Instance; |
|||
} |
|||
|
|||
public virtual async Task HandleEventAsync(RealTimeEto<ChatMessage> eventData) |
|||
{ |
|||
Logger.LogDebug($"Persistent chat message."); |
|||
|
|||
await MessageStore.StoreMessageAsync(eventData.Data); |
|||
|
|||
// 发送消息
|
|||
foreach (var provider in MessageSenderProviderManager.Providers) |
|||
{ |
|||
Logger.LogDebug($"Sending message with provider {provider.Name}"); |
|||
await provider.SendMessageAsync(eventData.Data); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
using LINGYUN.Abp.IM; |
|||
using LINGYUN.Abp.IM.Messages; |
|||
using LINGYUN.Abp.RealTime; |
|||
using Microsoft.Extensions.Logging; |
|||
using Microsoft.Extensions.Logging.Abstractions; |
|||
using Microsoft.Extensions.Options; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.EventBus.Distributed; |
|||
|
|||
namespace LINGYUN.Abp.MessageService.EventBus.Distributed |
|||
{ |
|||
public class ChatMessageEventHandler : IDistributedEventHandler<RealTimeEto<ChatMessage>>, ITransientDependency |
|||
{ |
|||
/// <summary>
|
|||
/// Reference to <see cref="ILogger<DefaultNotificationDispatcher>"/>.
|
|||
/// </summary>
|
|||
public ILogger<ChatMessageEventHandler> Logger { get; set; } |
|||
/// <summary>
|
|||
/// Reference to <see cref="AbpIMOptions"/>.
|
|||
/// </summary>
|
|||
protected AbpIMOptions Options { get; } |
|||
|
|||
protected IMessageStore MessageStore { get; } |
|||
protected IMessageBlocker MessageBlocker { get; } |
|||
protected IMessageSenderProviderManager MessageSenderProviderManager { get; } |
|||
|
|||
public ChatMessageEventHandler( |
|||
IOptions<AbpIMOptions> options, |
|||
IMessageStore messageStore, |
|||
IMessageBlocker messageBlocker, |
|||
IMessageSenderProviderManager messageSenderProviderManager) |
|||
{ |
|||
Options = options.Value; |
|||
MessageStore = messageStore; |
|||
MessageBlocker = messageBlocker; |
|||
MessageSenderProviderManager = messageSenderProviderManager; |
|||
|
|||
Logger = NullLogger<ChatMessageEventHandler>.Instance; |
|||
} |
|||
|
|||
public virtual async Task HandleEventAsync(RealTimeEto<ChatMessage> eventData) |
|||
{ |
|||
Logger.LogDebug($"Persistent chat message."); |
|||
|
|||
var message = eventData.Data; |
|||
// 消息拦截
|
|||
// 扩展敏感词汇过滤
|
|||
await MessageBlocker.InterceptAsync(message); |
|||
|
|||
await MessageStore.StoreMessageAsync(message); |
|||
|
|||
// 发送消息
|
|||
foreach (var provider in MessageSenderProviderManager.Providers) |
|||
{ |
|||
Logger.LogDebug($"Sending message with provider {provider.Name}"); |
|||
await provider.SendMessageAsync(message); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
Loading…
Reference in new issue