Skip to content

Commit

Permalink
Merge branch 'dev' into integration-services
Browse files Browse the repository at this point in the history
  • Loading branch information
hikalkan committed Sep 9, 2022
2 parents c56473e + 9d2902b commit 17a260f
Show file tree
Hide file tree
Showing 91 changed files with 2,036 additions and 382 deletions.
19 changes: 19 additions & 0 deletions docs/en/Distributed-Locking.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,25 @@ namespace AbpDemo
* `timeout` (`TimeSpan`): A timeout value to wait to obtain the lock. Default value is `TimeSpan.Zero`, which means it doesn't wait if the lock is already owned by another application.
* `cancellationToken`: A cancellation token that can be triggered later to cancel the operation.

### Configuration

#### AbpDistributedLockOptions

`AbpDistributedLockOptions` is the main options class to configure the distributed locking.

**Example: Set the distributed lock key prefix for the application**

Configure<AbpDistributedLockOptions>(options =>
{
options.KeyPrefix = "MyApp1";
});

> Write that code inside the `ConfigureServices` method of your [module class](Module-Development-Basics.md).

##### Available Options

* KeyPrefix (string, default: null): Specify the lock name prefix.

### Using DistributedLock Library's API

ABP's `IAbpDistributedLock` service is very limited and mainly designed to be internally used by the ABP Framework. For your own applications, you can use the DistributedLock library's own API. See its [own documentation](https://github.com/madelson/DistributedLock) for details.
Expand Down
19 changes: 19 additions & 0 deletions docs/zh-Hans/Distributed-Locking.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,25 @@ namespace AbpDemo
* `timeout` (`TimeSpan`): 等待获取锁的超时值. 默认值为`TimeSpan.Zero`, 这意味着如果锁已经被另一个应用程序拥有, 它不会等待.
* `cancellationToken`: 取消令牌可在触发后取消操作.

### 配置

#### AbpDistributedLockOptions

`AbpDistributedLockOptions` 是配置分布式锁的主要选项类.

**示例: 设置应用程序的分布式锁Key前缀**

Configure<AbpDistributedLockOptions>(options =>
{
options.KeyPrefix = "MyApp1";
});

> 在你的[模块类](Module-Development-Basics.md)中的 `ConfigureServices` 方法进行配置.

##### 可用选项

* KeyPrefix (string, 默认值: null): 指定分布式锁名称前缀.

### 使用DistributedLock库的API

ABP的`IAbpDistributedLock`服务非常有限, 主要用于ABP框架的内部使用. 对于你自己的应用程序, 可以使用DistributedLock库自己的API. 参见[文档](https://github.com/madelson/DistributedLock)详细信息.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,26 +9,43 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly;

public class WebAssemblyCachedApplicationConfigurationClient : ICachedApplicationConfigurationClient, ITransientDependency
{
protected AbpApplicationConfigurationClientProxy ApplicationConfigurationAppService { get; }
protected AbpApplicationConfigurationClientProxy ApplicationConfigurationClientProxy { get; }

protected AbpApplicationLocalizationClientProxy ApplicationLocalizationClientProxy { get; }

protected ApplicationConfigurationCache Cache { get; }

protected ICurrentTenantAccessor CurrentTenantAccessor { get; }

public WebAssemblyCachedApplicationConfigurationClient(
AbpApplicationConfigurationClientProxy applicationConfigurationAppService,
AbpApplicationConfigurationClientProxy applicationConfigurationClientProxy,
ApplicationConfigurationCache cache,
ICurrentTenantAccessor currentTenantAccessor)
ICurrentTenantAccessor currentTenantAccessor,
AbpApplicationLocalizationClientProxy applicationLocalizationClientProxy)
{
ApplicationConfigurationAppService = applicationConfigurationAppService;
ApplicationConfigurationClientProxy = applicationConfigurationClientProxy;
Cache = cache;
CurrentTenantAccessor = currentTenantAccessor;
ApplicationLocalizationClientProxy = applicationLocalizationClientProxy;
}

public virtual async Task InitializeAsync()
{
var configurationDto = await ApplicationConfigurationAppService.GetAsync();
var configurationDto = await ApplicationConfigurationClientProxy.GetAsync(
new ApplicationConfigurationRequestOptions {
IncludeLocalizationResources = false
}
);

var localizationDto = await ApplicationLocalizationClientProxy.GetAsync(
new ApplicationLocalizationRequestDto {
CultureName = configurationDto.Localization.CurrentCulture.Name,
OnlyDynamics = true
}
);

configurationDto.Localization.Resources = localizationDto.Resources;

Cache.Set(configurationDto);

CurrentTenantAccessor.Current = new BasicTenantInfo(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,11 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClientProxies;
[ExposeServices(typeof(IAbpApplicationConfigurationAppService), typeof(AbpApplicationConfigurationClientProxy))]
public partial class AbpApplicationConfigurationClientProxy : ClientProxyBase<IAbpApplicationConfigurationAppService>, IAbpApplicationConfigurationAppService
{
public virtual async Task<ApplicationConfigurationDto> GetAsync()
public virtual async Task<ApplicationConfigurationDto> GetAsync(ApplicationConfigurationRequestOptions options)
{
return await RequestAsync<ApplicationConfigurationDto>(nameof(GetAsync));
return await RequestAsync<ApplicationConfigurationDto>(nameof(GetAsync), new ClientProxyRequestTypeValue
{
{ typeof(ApplicationConfigurationRequestOptions), options }
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// This file is automatically generated by ABP framework to use MVC Controllers from CSharp
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Http.Client;
using Volo.Abp.Http.Modeling;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http.Client.ClientProxying;
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;

// ReSharper disable once CheckNamespace
namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClientProxies;

[Dependency(ReplaceServices = true)]
[ExposeServices(typeof(IAbpApplicationLocalizationAppService), typeof(AbpApplicationLocalizationClientProxy))]
public partial class AbpApplicationLocalizationClientProxy : ClientProxyBase<IAbpApplicationLocalizationAppService>, IAbpApplicationLocalizationAppService
{
public virtual async Task<ApplicationLocalizationDto> GetAsync(ApplicationLocalizationRequestDto input)
{
return await RequestAsync<ApplicationLocalizationDto>(nameof(GetAsync), new ClientProxyRequestTypeValue
{
{ typeof(ApplicationLocalizationRequestDto), input }
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// This file is part of AbpApplicationLocalizationClientProxy, you can customize it here
// ReSharper disable once CheckNamespace
namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClientProxies;

public partial class AbpApplicationLocalizationClientProxy
{
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
"Pages.Abp.MultiTenancy.AbpTenantController": {
"controllerName": "AbpTenant",
"controllerGroupName": "AbpTenant",
"isRemoteService": true,
"apiVersion": null,
"type": "Pages.Abp.MultiTenancy.AbpTenantController",
"interfaces": [
{
Expand Down Expand Up @@ -93,21 +95,45 @@
"Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController": {
"controllerName": "AbpApplicationConfiguration",
"controllerGroupName": "AbpApplicationConfiguration",
"isRemoteService": true,
"apiVersion": null,
"type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController",
"interfaces": [
{
"type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IAbpApplicationConfigurationAppService"
}
],
"actions": {
"GetAsync": {
"uniqueName": "GetAsync",
"GetAsyncByOptions": {
"uniqueName": "GetAsyncByOptions",
"name": "GetAsync",
"httpMethod": "GET",
"url": "api/abp/application-configuration",
"supportedVersions": [],
"parametersOnMethod": [],
"parameters": [],
"parametersOnMethod": [
{
"name": "options",
"typeAsString": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationRequestOptions, Volo.Abp.AspNetCore.Mvc.Contracts",
"type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationRequestOptions",
"typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationRequestOptions",
"isOptional": false,
"defaultValue": null
}
],
"parameters": [
{
"nameOnMethod": "options",
"name": "IncludeLocalizationResources",
"jsonName": null,
"type": "System.Boolean",
"typeSimple": "boolean",
"isOptional": false,
"defaultValue": null,
"constraintTypes": null,
"bindingSourceId": "ModelBinding",
"descriptorName": "options"
}
],
"returnValue": {
"type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto",
"typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto"
Expand All @@ -117,9 +143,74 @@
}
}
},
"Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationLocalizationController": {
"controllerName": "AbpApplicationLocalization",
"controllerGroupName": "AbpApplicationLocalization",
"isRemoteService": true,
"apiVersion": null,
"type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationLocalizationController",
"interfaces": [
{
"type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IAbpApplicationLocalizationAppService"
}
],
"actions": {
"GetAsyncByInput": {
"uniqueName": "GetAsyncByInput",
"name": "GetAsync",
"httpMethod": "GET",
"url": "api/abp/application-localization",
"supportedVersions": [],
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationRequestDto, Volo.Abp.AspNetCore.Mvc.Contracts",
"type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationRequestDto",
"typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationRequestDto",
"isOptional": false,
"defaultValue": null
}
],
"parameters": [
{
"nameOnMethod": "input",
"name": "CultureName",
"jsonName": null,
"type": "System.String",
"typeSimple": "string",
"isOptional": false,
"defaultValue": null,
"constraintTypes": null,
"bindingSourceId": "ModelBinding",
"descriptorName": "input"
},
{
"nameOnMethod": "input",
"name": "OnlyDynamics",
"jsonName": null,
"type": "System.Boolean",
"typeSimple": "boolean",
"isOptional": false,
"defaultValue": null,
"constraintTypes": null,
"bindingSourceId": "ModelBinding",
"descriptorName": "input"
}
],
"returnValue": {
"type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationDto",
"typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationDto"
},
"allowAnonymous": null,
"implementFrom": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IAbpApplicationLocalizationAppService"
}
}
},
"Volo.Abp.AspNetCore.Mvc.ApiExploring.AbpApiDefinitionController": {
"controllerName": "AbpApiDefinition",
"controllerGroupName": "AbpApiDefinition",
"isRemoteService": true,
"apiVersion": null,
"type": "Volo.Abp.AspNetCore.Mvc.ApiExploring.AbpApiDefinitionController",
"interfaces": [],
"actions": {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Localization;
using Volo.Abp.Localization.External;

namespace Volo.Abp.AspNetCore.Mvc.Client;

public class RemoteExternalLocalizationStore : IExternalLocalizationStore, ITransientDependency
{
protected ICachedApplicationConfigurationClient ConfigurationClient { get; }
protected AbpLocalizationOptions LocalizationOptions { get; }

public RemoteExternalLocalizationStore(
ICachedApplicationConfigurationClient configurationClient,
IOptions<AbpLocalizationOptions> localizationOptions)
{
ConfigurationClient = configurationClient;
LocalizationOptions = localizationOptions.Value;
}

public virtual LocalizationResourceBase GetResourceOrNull(string resourceName)
{
var configurationDto = ConfigurationClient.Get();
return CreateLocalizationResourceFromConfigurationOrNull(resourceName, configurationDto);
}

public virtual async Task<LocalizationResourceBase> GetResourceOrNullAsync(string resourceName)
{
var configurationDto = await ConfigurationClient.GetAsync();
return CreateLocalizationResourceFromConfigurationOrNull(resourceName, configurationDto);
}

public virtual async Task<string[]> GetResourceNamesAsync()
{
var configurationDto = await ConfigurationClient.GetAsync();
return configurationDto
.Localization
.Resources
.Keys
.Where(x => !LocalizationOptions.Resources.ContainsKey(x))
.ToArray();
; }

public virtual async Task<LocalizationResourceBase[]> GetResourcesAsync()
{
var configurationDto = await ConfigurationClient.GetAsync();
var resources = new List<LocalizationResourceBase>();

foreach (var resource in configurationDto.Localization.Resources)
{
if (LocalizationOptions.Resources.ContainsKey(resource.Key))
{
continue;
}

resources.Add(CreateNonTypedLocalizationResource(resource.Key, resource.Value));
}

return resources.ToArray();
}

protected virtual LocalizationResourceBase CreateLocalizationResourceFromConfigurationOrNull(
string resourceName,
ApplicationConfigurationDto configurationDto)
{
var resourceDto = configurationDto.Localization.Resources.GetOrDefault(resourceName);

if (resourceDto == null)
{
return null;
}

return CreateNonTypedLocalizationResource(resourceName, resourceDto);
}

protected virtual NonTypedLocalizationResource CreateNonTypedLocalizationResource(
string resourceName,
ApplicationLocalizationResourceDto resourceDto)
{
return new NonTypedLocalizationResource(resourceName)
.AddBaseResources(resourceDto.BaseResources);
}
}
Loading

0 comments on commit 17a260f

Please sign in to comment.