Browse Source

feat(dapr): 升级dapr到1.5.0版本,分离出DaprClient作为独立模块确保单一职责.

pull/394/head
cKey 4 years ago
parent
commit
481c2b79c7
  1. 35
      aspnet-core/LINGYUN.MicroService.All.sln
  2. 13
      aspnet-core/LINGYUN.MicroService.Common.sln
  3. 2
      aspnet-core/modules/dapr/LINGYUN.Abp.Dapr.Actors.AspNetCore/LINGYUN.Abp.Dapr.Actors.AspNetCore.csproj
  4. 2
      aspnet-core/modules/dapr/LINGYUN.Abp.Dapr.Actors/LINGYUN.Abp.Dapr.Actors.csproj
  5. 7
      aspnet-core/modules/dapr/LINGYUN.Abp.Dapr.Client/LINGYUN.Abp.Dapr.Client.csproj
  6. 48
      aspnet-core/modules/dapr/LINGYUN.Abp.Dapr.Client/LINGYUN/Abp/Dapr/Client/AbpDaprClientModule.cs
  7. 429
      aspnet-core/modules/dapr/LINGYUN.Abp.Dapr.Client/Microsoft/Extensions/DependencyInjection/ServiceCollectionDynamicDaprClientProxyExtensions.cs
  8. 144
      aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/Dapr/Client/DaprClientBuilderExtensions.cs
  9. 42
      aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/Dapr/Client/DaprClientFactoryOptions.cs
  10. 34
      aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/Dapr/Client/DefaultDaprClientBuilder.cs
  11. 164
      aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/Dapr/Client/DefaultDaprClientFactory.cs
  12. 20
      aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/Dapr/Client/IDaprClientBuilder.cs
  13. 14
      aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/Dapr/Client/IDaprClientFactory.cs
  14. 15
      aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/LINGYUN.Abp.Dapr.csproj
  15. 8
      aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/LINGYUN/Abp/Dapr/AbpDaprModule.cs
  16. 99
      aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/Microsoft/Extensions/DependencyInjection/ServiceCollectionDaprClientExtensions.cs
  17. 26
      aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/README.md

35
aspnet-core/LINGYUN.MicroService.All.sln

@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30011.22
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{C5CAD011-DF84-4914-939C-0C029DCEF26F}"
EndProject
@ -359,6 +359,16 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.UI.Navigation",
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.UI.Navigation.VueVbenAdmin", "modules\platform\LINGYUN.Abp.UI.Navigation.VueVbenAdmin\LINGYUN.Abp.UI.Navigation.VueVbenAdmin.csproj", "{67A76560-D39F-4D49-B858-B476E1DFE37B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dapr", "dapr", "{DC33925B-264D-421B-96CC-46F853CBCC70}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Dapr", "modules\dapr\LINGYUN.Abp.Dapr\LINGYUN.Abp.Dapr.csproj", "{1B8FCBD9-8807-44E4-B91F-F4AB738CB26F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Dapr.Client", "modules\dapr\LINGYUN.Abp.Dapr.Client\LINGYUN.Abp.Dapr.Client.csproj", "{93317D44-835C-4F5E-B85D-580D51D5FFF4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Dapr.Actors", "modules\dapr\LINGYUN.Abp.Dapr.Actors\LINGYUN.Abp.Dapr.Actors.csproj", "{DAF80936-FBEC-45AB-92DF-34966B0148FD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Dapr.Actors.AspNetCore", "modules\dapr\LINGYUN.Abp.Dapr.Actors.AspNetCore\LINGYUN.Abp.Dapr.Actors.AspNetCore.csproj", "{995756A1-A379-4797-89F0-87D219B5AF00}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -937,6 +947,22 @@ Global
{67A76560-D39F-4D49-B858-B476E1DFE37B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{67A76560-D39F-4D49-B858-B476E1DFE37B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{67A76560-D39F-4D49-B858-B476E1DFE37B}.Release|Any CPU.Build.0 = Release|Any CPU
{1B8FCBD9-8807-44E4-B91F-F4AB738CB26F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1B8FCBD9-8807-44E4-B91F-F4AB738CB26F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1B8FCBD9-8807-44E4-B91F-F4AB738CB26F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1B8FCBD9-8807-44E4-B91F-F4AB738CB26F}.Release|Any CPU.Build.0 = Release|Any CPU
{93317D44-835C-4F5E-B85D-580D51D5FFF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{93317D44-835C-4F5E-B85D-580D51D5FFF4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{93317D44-835C-4F5E-B85D-580D51D5FFF4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{93317D44-835C-4F5E-B85D-580D51D5FFF4}.Release|Any CPU.Build.0 = Release|Any CPU
{DAF80936-FBEC-45AB-92DF-34966B0148FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DAF80936-FBEC-45AB-92DF-34966B0148FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DAF80936-FBEC-45AB-92DF-34966B0148FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DAF80936-FBEC-45AB-92DF-34966B0148FD}.Release|Any CPU.Build.0 = Release|Any CPU
{995756A1-A379-4797-89F0-87D219B5AF00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{995756A1-A379-4797-89F0-87D219B5AF00}.Debug|Any CPU.Build.0 = Debug|Any CPU
{995756A1-A379-4797-89F0-87D219B5AF00}.Release|Any CPU.ActiveCfg = Release|Any CPU
{995756A1-A379-4797-89F0-87D219B5AF00}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -1114,6 +1140,11 @@ Global
{7D02D803-F9A9-492C-9B5E-454E4B258466} = {C5CAD011-DF84-4914-939C-0C029DCEF26F}
{FD04A084-BB8A-4733-B9C5-FACF40342A8A} = {7D02D803-F9A9-492C-9B5E-454E4B258466}
{67A76560-D39F-4D49-B858-B476E1DFE37B} = {F4923692-D343-4318-AECA-96F580B1A563}
{DC33925B-264D-421B-96CC-46F853CBCC70} = {C5CAD011-DF84-4914-939C-0C029DCEF26F}
{1B8FCBD9-8807-44E4-B91F-F4AB738CB26F} = {DC33925B-264D-421B-96CC-46F853CBCC70}
{93317D44-835C-4F5E-B85D-580D51D5FFF4} = {DC33925B-264D-421B-96CC-46F853CBCC70}
{DAF80936-FBEC-45AB-92DF-34966B0148FD} = {DC33925B-264D-421B-96CC-46F853CBCC70}
{995756A1-A379-4797-89F0-87D219B5AF00} = {DC33925B-264D-421B-96CC-46F853CBCC70}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C95FDF91-16F2-4A8B-A4BE-0E62D1B66718}

13
aspnet-core/LINGYUN.MicroService.Common.sln

@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30011.22
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{02EA4E78-5891-43BC-944F-3E52FEE032E4}"
EndProject
@ -188,10 +188,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtection"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtection.EntityFrameworkCore", "modules\data-protection\LINGYUN.Abp.DataProtection.EntityFrameworkCore\LINGYUN.Abp.DataProtection.EntityFrameworkCore.csproj", "{E16CCB14-E629-48E6-9603-53BBFF185318}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.DataProtection.Tests", "tests\LINGYUN.Abp.DataProtection.Tests\LINGYUN.Abp.DataProtection.Tests.csproj", "{FBE7D8CB-1D99-4342-A953-B9AB46E0B14D}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtection.Tests", "tests\LINGYUN.Abp.DataProtection.Tests\LINGYUN.Abp.DataProtection.Tests.csproj", "{FBE7D8CB-1D99-4342-A953-B9AB46E0B14D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.EntityFrameworkCore.Tests", "tests\LINGYUN.Abp.EntityFrameworkCore.Tests\LINGYUN.Abp.EntityFrameworkCore.Tests.csproj", "{2F556889-006C-4A9C-8CA3-E31200C06FC9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.Dapr", "modules\dapr\LINGYUN.Abp.Dapr\LINGYUN.Abp.Dapr.csproj", "{73C9A7E7-846D-49E2-B223-E705D6C48BE7}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -498,6 +500,10 @@ Global
{2F556889-006C-4A9C-8CA3-E31200C06FC9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2F556889-006C-4A9C-8CA3-E31200C06FC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2F556889-006C-4A9C-8CA3-E31200C06FC9}.Release|Any CPU.Build.0 = Release|Any CPU
{73C9A7E7-846D-49E2-B223-E705D6C48BE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{73C9A7E7-846D-49E2-B223-E705D6C48BE7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{73C9A7E7-846D-49E2-B223-E705D6C48BE7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{73C9A7E7-846D-49E2-B223-E705D6C48BE7}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -594,6 +600,7 @@ Global
{E16CCB14-E629-48E6-9603-53BBFF185318} = {A0910407-CE69-4DC8-9721-F4324C22EEA8}
{FBE7D8CB-1D99-4342-A953-B9AB46E0B14D} = {B86C21A4-73B7-471E-B73A-B4B905EC9435}
{2F556889-006C-4A9C-8CA3-E31200C06FC9} = {B86C21A4-73B7-471E-B73A-B4B905EC9435}
{73C9A7E7-846D-49E2-B223-E705D6C48BE7} = {7FDFB22F-1BFF-4E05-9427-78B7A8461D50}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {06C707C6-02C0-411A-AD3B-2D0E13787CB8}

2
aspnet-core/modules/dapr/LINGYUN.Abp.Dapr.Actors.AspNetCore/LINGYUN.Abp.Dapr.Actors.AspNetCore.csproj

@ -8,7 +8,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapr.Actors.AspNetCore" Version="1.4.0" />
<PackageReference Include="Dapr.Actors.AspNetCore" Version="1.5.0" />
<PackageReference Include="Volo.Abp.AspNetCore" Version="4.4.0" />
</ItemGroup>

2
aspnet-core/modules/dapr/LINGYUN.Abp.Dapr.Actors/LINGYUN.Abp.Dapr.Actors.csproj

@ -8,7 +8,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapr.Actors" Version="1.4.0" />
<PackageReference Include="Dapr.Actors" Version="1.5.0" />
<PackageReference Include="Volo.Abp.Http.Client" Version="4.4.0" />
</ItemGroup>
</Project>

7
aspnet-core/modules/dapr/LINGYUN.Abp.Dapr.Client/LINGYUN.Abp.Dapr.Client.csproj

@ -1,13 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapr.Client" Version="1.4.0" />
<PackageReference Include="Volo.Abp.Http.Client" Version="4.4.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\LINGYUN.Abp.Dapr\LINGYUN.Abp.Dapr.csproj" />
</ItemGroup>
</Project>

48
aspnet-core/modules/dapr/LINGYUN.Abp.Dapr.Client/LINGYUN/Abp/Dapr/Client/AbpDaprClientModule.cs

@ -1,24 +1,24 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Http.Client;
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.Dapr.Client
{
[DependsOn(
typeof(AbpHttpClientModule)
)]
public class AbpDaprClientModule : AbpModule
{
/// <summary>
/// 与AbpHttpClient集成,创建一个命名HttpClient
/// </summary>
internal const string DaprHttpClient = "_AbpDaprProxyClient";
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
Configure<AbpDaprRemoteServiceOptions>(configuration);
context.Services.AddHttpClient(DaprHttpClient);
}
}
}
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Http.Client;
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.Dapr.Client
{
[DependsOn(
typeof(AbpHttpClientModule)
)]
public class AbpDaprClientModule : AbpModule
{
/// <summary>
/// 与AbpHttpClient集成,创建一个命名HttpClient
/// </summary>
internal const string DaprHttpClient = "_AbpDaprProxyClient";
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
Configure<AbpDaprRemoteServiceOptions>(configuration);
context.Services.AddHttpClient(DaprHttpClient);
}
}
}

429
aspnet-core/modules/dapr/LINGYUN.Abp.Dapr.Client/Microsoft/Extensions/DependencyInjection/ServiceCollectionDynamicDaprClientProxyExtensions.cs

@ -1,257 +1,172 @@
using Castle.DynamicProxy;
using Dapr.Client;
using JetBrains.Annotations;
using LINGYUN.Abp.Dapr.Client;
using LINGYUN.Abp.Dapr.Client.DynamicProxying;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
using System;
using System.Linq;
using System.Reflection;
using Volo.Abp;
using Volo.Abp.Castle.DynamicProxy;
using Volo.Abp.Validation;
namespace Microsoft.Extensions.DependencyInjection
{
public static class ServiceCollectionDynamicDaprClientProxyExtensions
{
private static readonly ProxyGenerator ProxyGeneratorInstance = new ProxyGenerator();
#region Add DaprClient Builder
public static IServiceCollection AddDaprClient(
[NotNull] this IServiceCollection services)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
services.AddLogging();
services.AddOptions();
services.TryAddSingleton<DefaultDaprClientFactory>();
services.TryAddSingleton<IDaprClientFactory>(serviceProvider => serviceProvider.GetRequiredService<DefaultDaprClientFactory>());
return services;
}
public static IDaprClientBuilder AddDaprClient(
[NotNull] this IServiceCollection services,
string name)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
services.AddDaprClient();
return new DefaultDaprClientBuilder(services, name);
}
public static IDaprClientBuilder AddDaprClient(
[NotNull] this IServiceCollection services,
string name,
Action<DaprClientBuilder> configureClient)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
if (name == null)
{
throw new ArgumentNullException(nameof(name));
}
if (configureClient == null)
{
throw new ArgumentNullException(nameof(configureClient));
}
services.AddDaprClient();
var builder = new DefaultDaprClientBuilder(services, name);
builder.ConfigureDaprClient(configureClient);
return builder;
}
public static IDaprClientBuilder AddDaprClient(
[NotNull] this IServiceCollection services,
string name,
Action<IServiceProvider, DaprClientBuilder> configureClient)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
if (name == null)
{
throw new ArgumentNullException(nameof(name));
}
if (configureClient == null)
{
throw new ArgumentNullException(nameof(configureClient));
}
services.AddDaprClient();
var builder = new DefaultDaprClientBuilder(services, name);
builder.ConfigureDaprClient(configureClient);
return builder;
}
#endregion
#region Add DaprClient Proxies
public static IServiceCollection AddDaprClientProxies(
[NotNull] this IServiceCollection services,
[NotNull] Assembly assembly,
[NotNull] string remoteServiceConfigurationName = DaprRemoteServiceConfigurationDictionary.DefaultName,
bool asDefaultServices = true)
{
Check.NotNull(services, nameof(assembly));
var serviceTypes = assembly.GetTypes().Where(IsSuitableForDynamicActorProxying).ToArray();
foreach (var serviceType in serviceTypes)
{
services.AddDaprClientProxy(
serviceType,
remoteServiceConfigurationName,
asDefaultServices
);
}
return services;
}
public static IServiceCollection AddDaprClientProxy<T>(
[NotNull] this IServiceCollection services,
[NotNull] string remoteServiceConfigurationName = DaprRemoteServiceConfigurationDictionary.DefaultName,
bool asDefaultService = true)
{
return services.AddDaprClientProxy(
typeof(T),
remoteServiceConfigurationName,
asDefaultService
);
}
public static IServiceCollection AddDaprClientProxy(
[NotNull] this IServiceCollection services,
[NotNull] Type type,
[NotNull] string remoteServiceConfigurationName = DaprRemoteServiceConfigurationDictionary.DefaultName,
bool asDefaultService = true)
{
Check.NotNull(services, nameof(services));
Check.NotNull(type, nameof(type));
Check.NotNullOrWhiteSpace(remoteServiceConfigurationName, nameof(remoteServiceConfigurationName));
services.AddDaprClientFactory(remoteServiceConfigurationName);
services.Configure<AbpDaprClientProxyOptions>(options =>
{
options.DaprClientProxies[type] = new DynamicDaprClientProxyConfig(type, remoteServiceConfigurationName);
});
var interceptorType = typeof(DynamicDaprClientProxyInterceptor<>).MakeGenericType(type);
services.AddTransient(interceptorType);
var interceptorAdapterType = typeof(AbpAsyncDeterminationInterceptor<>).MakeGenericType(interceptorType);
var validationInterceptorAdapterType =
typeof(AbpAsyncDeterminationInterceptor<>).MakeGenericType(typeof(ValidationInterceptor));
if (asDefaultService)
{
services.AddTransient(
type,
serviceProvider => ProxyGeneratorInstance
.CreateInterfaceProxyWithoutTarget(
type,
(IInterceptor)serviceProvider.GetRequiredService(validationInterceptorAdapterType),
(IInterceptor)serviceProvider.GetRequiredService(interceptorAdapterType)
)
);
}
services.AddTransient(
typeof(IDaprClientProxy<>).MakeGenericType(type),
serviceProvider =>
{
var service = ProxyGeneratorInstance
.CreateInterfaceProxyWithoutTarget(
type,
(IInterceptor)serviceProvider.GetRequiredService(validationInterceptorAdapterType),
(IInterceptor)serviceProvider.GetRequiredService(interceptorAdapterType)
);
return Activator.CreateInstance(
typeof(DaprClientProxy<>).MakeGenericType(type),
service
);
});
return services;
}
private static IServiceCollection AddDaprClientFactory(
[NotNull] this IServiceCollection services,
[NotNull] string remoteServiceConfigurationName = DaprRemoteServiceConfigurationDictionary.DefaultName)
{
var preOptions = services.ExecutePreConfiguredActions<AbpDaprClientBuilderOptions>();
if (preOptions.ConfiguredProxyClients.Contains(remoteServiceConfigurationName))
{
return services;
}
var clientBuilder = services.AddDaprClient(remoteServiceConfigurationName, (IServiceProvider provider, DaprClientBuilder builder) =>
{
var options = provider.GetRequiredService<IOptions<AbpDaprRemoteServiceOptions>>().Value;
builder.UseHttpEndpoint(
options.RemoteServices
.GetConfigurationOrDefault(remoteServiceConfigurationName).BaseUrl);
foreach (var clientBuildAction in preOptions.ProxyClientBuildActions)
{
clientBuildAction(remoteServiceConfigurationName, provider, builder);
}
});
clientBuilder.ConfigureDaprClient((client) =>
{
foreach (var clientBuildAction in preOptions.ProxyClientActions)
{
clientBuildAction(remoteServiceConfigurationName, client);
}
});
services.PreConfigure<AbpDaprClientBuilderOptions>(options =>
{
options.ConfiguredProxyClients.Add(remoteServiceConfigurationName);
});
return services;
}
private static bool IsSuitableForDynamicActorProxying(Type type)
{
//TODO: Add option to change type filter
return type.IsInterface
&& type.IsPublic
&& !type.IsGenericType
&& typeof(IRemoteService).IsAssignableFrom(type);
}
#endregion
}
}
using Castle.DynamicProxy;
using Dapr.Client;
using JetBrains.Annotations;
using LINGYUN.Abp.Dapr.Client;
using LINGYUN.Abp.Dapr.Client.DynamicProxying;
using Microsoft.Extensions.Options;
using System;
using System.Linq;
using System.Reflection;
using Volo.Abp;
using Volo.Abp.Castle.DynamicProxy;
using Volo.Abp.Json.SystemTextJson;
using Volo.Abp.Validation;
namespace Microsoft.Extensions.DependencyInjection
{
public static class ServiceCollectionDynamicDaprClientProxyExtensions
{
private static readonly ProxyGenerator ProxyGeneratorInstance = new ProxyGenerator();
#region Add DaprClient Proxies
public static IServiceCollection AddDaprClientProxies(
[NotNull] this IServiceCollection services,
[NotNull] Assembly assembly,
[NotNull] string remoteServiceConfigurationName = DaprRemoteServiceConfigurationDictionary.DefaultName,
bool asDefaultServices = true)
{
Check.NotNull(services, nameof(assembly));
var serviceTypes = assembly.GetTypes().Where(IsSuitableForDynamicActorProxying).ToArray();
foreach (var serviceType in serviceTypes)
{
services.AddDaprClientProxy(
serviceType,
remoteServiceConfigurationName,
asDefaultServices
);
}
return services;
}
public static IServiceCollection AddDaprClientProxy<T>(
[NotNull] this IServiceCollection services,
[NotNull] string remoteServiceConfigurationName = DaprRemoteServiceConfigurationDictionary.DefaultName,
bool asDefaultService = true)
{
return services.AddDaprClientProxy(
typeof(T),
remoteServiceConfigurationName,
asDefaultService
);
}
public static IServiceCollection AddDaprClientProxy(
[NotNull] this IServiceCollection services,
[NotNull] Type type,
[NotNull] string remoteServiceConfigurationName = DaprRemoteServiceConfigurationDictionary.DefaultName,
bool asDefaultService = true)
{
Check.NotNull(services, nameof(services));
Check.NotNull(type, nameof(type));
Check.NotNullOrWhiteSpace(remoteServiceConfigurationName, nameof(remoteServiceConfigurationName));
services.AddDaprClientFactory(remoteServiceConfigurationName);
services.Configure<AbpDaprClientProxyOptions>(options =>
{
options.DaprClientProxies[type] = new DynamicDaprClientProxyConfig(type, remoteServiceConfigurationName);
});
var interceptorType = typeof(DynamicDaprClientProxyInterceptor<>).MakeGenericType(type);
services.AddTransient(interceptorType);
var interceptorAdapterType = typeof(AbpAsyncDeterminationInterceptor<>).MakeGenericType(interceptorType);
var validationInterceptorAdapterType =
typeof(AbpAsyncDeterminationInterceptor<>).MakeGenericType(typeof(ValidationInterceptor));
if (asDefaultService)
{
services.AddTransient(
type,
serviceProvider => ProxyGeneratorInstance
.CreateInterfaceProxyWithoutTarget(
type,
(IInterceptor)serviceProvider.GetRequiredService(validationInterceptorAdapterType),
(IInterceptor)serviceProvider.GetRequiredService(interceptorAdapterType)
)
);
}
services.AddTransient(
typeof(IDaprClientProxy<>).MakeGenericType(type),
serviceProvider =>
{
var service = ProxyGeneratorInstance
.CreateInterfaceProxyWithoutTarget(
type,
(IInterceptor)serviceProvider.GetRequiredService(validationInterceptorAdapterType),
(IInterceptor)serviceProvider.GetRequiredService(interceptorAdapterType)
);
return Activator.CreateInstance(
typeof(DaprClientProxy<>).MakeGenericType(type),
service
);
});
return services;
}
private static IServiceCollection AddDaprClientFactory(
[NotNull] this IServiceCollection services,
[NotNull] string remoteServiceConfigurationName = DaprRemoteServiceConfigurationDictionary.DefaultName)
{
var preOptions = services.ExecutePreConfiguredActions<AbpDaprClientBuilderOptions>();
if (preOptions.ConfiguredProxyClients.Contains(remoteServiceConfigurationName))
{
return services;
}
var clientBuilder = services.AddDaprClient(remoteServiceConfigurationName, (IServiceProvider provider, DaprClientBuilder builder) =>
{
// TODO: 是否有必要? 使用框架的序列化配置
var jsonOptions = provider.GetRequiredService<IOptions<AbpSystemTextJsonSerializerOptions>>().Value;
builder.UseJsonSerializationOptions(jsonOptions.JsonSerializerOptions);
var options = provider.GetRequiredService<IOptions<AbpDaprRemoteServiceOptions>>().Value;
builder.UseHttpEndpoint(
options.RemoteServices
.GetConfigurationOrDefault(remoteServiceConfigurationName).BaseUrl);
foreach (var clientBuildAction in preOptions.ProxyClientBuildActions)
{
clientBuildAction(remoteServiceConfigurationName, provider, builder);
}
});
clientBuilder.ConfigureDaprClient((client) =>
{
foreach (var clientBuildAction in preOptions.ProxyClientActions)
{
clientBuildAction(remoteServiceConfigurationName, client);
}
});
services.PreConfigure<AbpDaprClientBuilderOptions>(options =>
{
options.ConfiguredProxyClients.Add(remoteServiceConfigurationName);
});
return services;
}
private static bool IsSuitableForDynamicActorProxying(Type type)
{
//TODO: Add option to change type filter
return type.IsInterface
&& type.IsPublic
&& !type.IsGenericType
&& typeof(IRemoteService).IsAssignableFrom(type);
}
#endregion
}
}

144
aspnet-core/modules/dapr/LINGYUN.Abp.Dapr.Client/Dapr/Client/DaprClientBuilderExtensions.cs → aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/Dapr/Client/DaprClientBuilderExtensions.cs

@ -1,72 +1,72 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System;
namespace Dapr.Client
{
public static class DaprClientBuilderExtensions
{
public static IDaprClientBuilder ConfigureDaprClient(this IDaprClientBuilder builder, Action<DaprClient> configureClient)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
if (configureClient == null)
{
throw new ArgumentNullException(nameof(configureClient));
}
builder.Services.Configure<DaprClientFactoryOptions>(builder.Name, options =>
{
options.DaprClientActions.Add(configureClient);
});
return builder;
}
public static IDaprClientBuilder ConfigureDaprClient(this IDaprClientBuilder builder, Action<DaprClientBuilder> configureBuilder)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
if (configureBuilder == null)
{
throw new ArgumentNullException(nameof(configureBuilder));
}
builder.Services.Configure<DaprClientFactoryOptions>(builder.Name, options =>
{
options.DaprClientBuilderActions.Add(configureBuilder);
});
return builder;
}
public static IDaprClientBuilder ConfigureDaprClient(this IDaprClientBuilder builder, Action<IServiceProvider, DaprClientBuilder> configureClientBuilder)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
if (configureClientBuilder == null)
{
throw new ArgumentNullException(nameof(configureClientBuilder));
}
builder.Services.AddTransient<IConfigureOptions<DaprClientFactoryOptions>>(services =>
{
return new ConfigureNamedOptions<DaprClientFactoryOptions>(builder.Name, (options) =>
{
options.DaprClientBuilderActions.Add(client => configureClientBuilder(services, client));
});
});
return builder;
}
}
}
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System;
namespace Dapr.Client
{
public static class DaprClientBuilderExtensions
{
public static IDaprClientBuilder ConfigureDaprClient(this IDaprClientBuilder builder, Action<DaprClient> configureClient)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
if (configureClient == null)
{
throw new ArgumentNullException(nameof(configureClient));
}
builder.Services.Configure<DaprClientFactoryOptions>(builder.Name, options =>
{
options.DaprClientActions.Add(configureClient);
});
return builder;
}
public static IDaprClientBuilder ConfigureDaprClient(this IDaprClientBuilder builder, Action<DaprClientBuilder> configureBuilder)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
if (configureBuilder == null)
{
throw new ArgumentNullException(nameof(configureBuilder));
}
builder.Services.Configure<DaprClientFactoryOptions>(builder.Name, options =>
{
options.DaprClientBuilderActions.Add(configureBuilder);
});
return builder;
}
public static IDaprClientBuilder ConfigureDaprClient(this IDaprClientBuilder builder, Action<IServiceProvider, DaprClientBuilder> configureClientBuilder)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
if (configureClientBuilder == null)
{
throw new ArgumentNullException(nameof(configureClientBuilder));
}
builder.Services.AddTransient<IConfigureOptions<DaprClientFactoryOptions>>(services =>
{
return new ConfigureNamedOptions<DaprClientFactoryOptions>(builder.Name, (options) =>
{
options.DaprClientBuilderActions.Add(client => configureClientBuilder(services, client));
});
});
return builder;
}
}
}

42
aspnet-core/modules/dapr/LINGYUN.Abp.Dapr.Client/Dapr/Client/DaprClientFactoryOptions.cs → aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/Dapr/Client/DaprClientFactoryOptions.cs

@ -1,21 +1,21 @@
using Grpc.Net.Client;
using System;
using System.Collections.Generic;
using System.Text.Json;
namespace Dapr.Client
{
public class DaprClientFactoryOptions
{
public string DaprApiToken{ get; set; }
public string HttpEndpoint { get; set; }
public string GrpcEndpoint { get; set; }
public GrpcChannelOptions GrpcChannelOptions { get; set; }
public JsonSerializerOptions JsonSerializerOptions { get; set; }
public IList<Action<DaprClient>> DaprClientActions { get; } = new List<Action<DaprClient>>();
public IList<Action<DaprClientBuilder>> DaprClientBuilderActions { get; } = new List<Action<DaprClientBuilder>>();
public DaprClientFactoryOptions()
{
}
}
}
using Grpc.Net.Client;
using System;
using System.Collections.Generic;
using System.Text.Json;
namespace Dapr.Client
{
public class DaprClientFactoryOptions
{
public string DaprApiToken{ get; set; }
public string HttpEndpoint { get; set; }
public string GrpcEndpoint { get; set; }
public GrpcChannelOptions GrpcChannelOptions { get; set; }
public JsonSerializerOptions JsonSerializerOptions { get; set; }
public IList<Action<DaprClient>> DaprClientActions { get; } = new List<Action<DaprClient>>();
public IList<Action<DaprClientBuilder>> DaprClientBuilderActions { get; } = new List<Action<DaprClientBuilder>>();
public DaprClientFactoryOptions()
{
}
}
}

34
aspnet-core/modules/dapr/LINGYUN.Abp.Dapr.Client/Dapr/Client/DefaultDaprClientBuilder.cs → aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/Dapr/Client/DefaultDaprClientBuilder.cs

@ -1,17 +1,17 @@
using Microsoft.Extensions.DependencyInjection;
namespace Dapr.Client
{
internal class DefaultDaprClientBuilder : IDaprClientBuilder
{
public DefaultDaprClientBuilder(IServiceCollection services, string name)
{
Services = services;
Name = name;
}
public string Name { get; }
public IServiceCollection Services { get; }
}
}
using Microsoft.Extensions.DependencyInjection;
namespace Dapr.Client
{
internal class DefaultDaprClientBuilder : IDaprClientBuilder
{
public DefaultDaprClientBuilder(IServiceCollection services, string name)
{
Services = services;
Name = name;
}
public string Name { get; }
public IServiceCollection Services { get; }
}
}

164
aspnet-core/modules/dapr/LINGYUN.Abp.Dapr.Client/Dapr/Client/DefaultDaprClientFactory.cs → aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/Dapr/Client/DefaultDaprClientFactory.cs

@ -1,82 +1,82 @@
using Microsoft.Extensions.Options;
using System;
using System.Collections.Concurrent;
using System.Threading;
namespace Dapr.Client
{
public class DefaultDaprClientFactory : IDaprClientFactory
{
private readonly IOptionsMonitor<DaprClientFactoryOptions> _optionsMonitor;
private readonly Func<string, Lazy<DaprClient>> _daprClientFactory;
internal readonly ConcurrentDictionary<string, Lazy<DaprClient>> _daprClients;
public DefaultDaprClientFactory(
IOptionsMonitor<DaprClientFactoryOptions> optionsMonitor)
{
_optionsMonitor = optionsMonitor ?? throw new ArgumentNullException(nameof(optionsMonitor));
_daprClients = new ConcurrentDictionary<string, Lazy<DaprClient>>();
_daprClientFactory = (name) =>
{
return new Lazy<DaprClient>(() =>
{
return InternalCreateDaprClient(name);
}, LazyThreadSafetyMode.ExecutionAndPublication);
};
}
public DaprClient CreateClient(string name)
{
if (name == null)
{
throw new ArgumentNullException(nameof(name));
}
var client = _daprClients.GetOrAdd(name, _daprClientFactory).Value;
var options = _optionsMonitor.Get(name);
for (int i = 0; i < options.DaprClientActions.Count; i++)
{
options.DaprClientActions[i](client);
}
return client;
}
internal DaprClient InternalCreateDaprClient(string name)
{
var builder = new DaprClientBuilder();
var options = _optionsMonitor.Get(name);
if (!string.IsNullOrWhiteSpace(options.HttpEndpoint))
{
builder.UseHttpEndpoint(options.HttpEndpoint);
}
if (!string.IsNullOrWhiteSpace(options.GrpcEndpoint))
{
builder.UseGrpcEndpoint(options.GrpcEndpoint);
}
if (options.GrpcChannelOptions != null)
{
builder.UseGrpcChannelOptions(options.GrpcChannelOptions);
}
if (options.JsonSerializerOptions != null)
{
builder.UseJsonSerializationOptions(options.JsonSerializerOptions);
}
builder.UseDaprApiToken(options.DaprApiToken);
for (int i = 0; i < options.DaprClientBuilderActions.Count; i++)
{
options.DaprClientBuilderActions[i](builder);
}
return builder.Build();
}
}
}
using Microsoft.Extensions.Options;
using System;
using System.Collections.Concurrent;
using System.Threading;
namespace Dapr.Client
{
public class DefaultDaprClientFactory : IDaprClientFactory
{
private readonly IOptionsMonitor<DaprClientFactoryOptions> _optionsMonitor;
private readonly Func<string, Lazy<DaprClient>> _daprClientFactory;
internal readonly ConcurrentDictionary<string, Lazy<DaprClient>> _daprClients;
public DefaultDaprClientFactory(
IOptionsMonitor<DaprClientFactoryOptions> optionsMonitor)
{
_optionsMonitor = optionsMonitor ?? throw new ArgumentNullException(nameof(optionsMonitor));
_daprClients = new ConcurrentDictionary<string, Lazy<DaprClient>>();
_daprClientFactory = (name) =>
{
return new Lazy<DaprClient>(() =>
{
return InternalCreateDaprClient(name);
}, LazyThreadSafetyMode.ExecutionAndPublication);
};
}
public DaprClient CreateClient(string name)
{
if (name == null)
{
throw new ArgumentNullException(nameof(name));
}
var client = _daprClients.GetOrAdd(name, _daprClientFactory).Value;
var options = _optionsMonitor.Get(name);
for (int i = 0; i < options.DaprClientActions.Count; i++)
{
options.DaprClientActions[i](client);
}
return client;
}
internal DaprClient InternalCreateDaprClient(string name)
{
var builder = new DaprClientBuilder();
var options = _optionsMonitor.Get(name);
if (!string.IsNullOrWhiteSpace(options.HttpEndpoint))
{
builder.UseHttpEndpoint(options.HttpEndpoint);
}
if (!string.IsNullOrWhiteSpace(options.GrpcEndpoint))
{
builder.UseGrpcEndpoint(options.GrpcEndpoint);
}
if (options.GrpcChannelOptions != null)
{
builder.UseGrpcChannelOptions(options.GrpcChannelOptions);
}
if (options.JsonSerializerOptions != null)
{
builder.UseJsonSerializationOptions(options.JsonSerializerOptions);
}
builder.UseDaprApiToken(options.DaprApiToken);
for (int i = 0; i < options.DaprClientBuilderActions.Count; i++)
{
options.DaprClientBuilderActions[i](builder);
}
return builder.Build();
}
}
}

20
aspnet-core/modules/dapr/LINGYUN.Abp.Dapr.Client/Dapr/Client/IDaprClientBuilder.cs → aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/Dapr/Client/IDaprClientBuilder.cs

@ -1,10 +1,10 @@
using Microsoft.Extensions.DependencyInjection;
namespace Dapr.Client
{
public interface IDaprClientBuilder
{
string Name { get; }
IServiceCollection Services { get; }
}
}
using Microsoft.Extensions.DependencyInjection;
namespace Dapr.Client
{
public interface IDaprClientBuilder
{
string Name { get; }
IServiceCollection Services { get; }
}
}

14
aspnet-core/modules/dapr/LINGYUN.Abp.Dapr.Client/Dapr/Client/IDaprClientFactory.cs → aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/Dapr/Client/IDaprClientFactory.cs

@ -1,7 +1,7 @@
namespace Dapr.Client
{
public interface IDaprClientFactory
{
DaprClient CreateClient(string name);
}
}
namespace Dapr.Client
{
public interface IDaprClientFactory
{
DaprClient CreateClient(string name);
}
}

15
aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/LINGYUN.Abp.Dapr.csproj

@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.Core" Version="4.4.0" />
<PackageReference Include="Dapr.Client" Version="1.5.0" />
</ItemGroup>
</Project>

8
aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/LINGYUN/Abp/Dapr/AbpDaprModule.cs

@ -0,0 +1,8 @@
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.Dapr
{
public class AbpDaprModule : AbpModule
{
}
}

99
aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/Microsoft/Extensions/DependencyInjection/ServiceCollectionDaprClientExtensions.cs

@ -0,0 +1,99 @@
using Dapr.Client;
using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection.Extensions;
using System;
namespace Microsoft.Extensions.DependencyInjection
{
public static class ServiceCollectionDaprClientExtensions
{
#region Add DaprClient Builder
public static IServiceCollection AddDaprClient(
[NotNull] this IServiceCollection services)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
services.AddLogging();
services.AddOptions();
services.TryAddSingleton<DefaultDaprClientFactory>();
services.TryAddSingleton<IDaprClientFactory>(serviceProvider => serviceProvider.GetRequiredService<DefaultDaprClientFactory>());
return services;
}
public static IDaprClientBuilder AddDaprClient(
[NotNull] this IServiceCollection services,
string name)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
services.AddDaprClient();
return new DefaultDaprClientBuilder(services, name);
}
public static IDaprClientBuilder AddDaprClient(
[NotNull] this IServiceCollection services,
string name,
Action<DaprClientBuilder> configureClient)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
if (name == null)
{
throw new ArgumentNullException(nameof(name));
}
if (configureClient == null)
{
throw new ArgumentNullException(nameof(configureClient));
}
services.AddDaprClient();
var builder = new DefaultDaprClientBuilder(services, name);
builder.ConfigureDaprClient(configureClient);
return builder;
}
public static IDaprClientBuilder AddDaprClient(
[NotNull] this IServiceCollection services,
string name,
Action<IServiceProvider, DaprClientBuilder> configureClient)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
if (name == null)
{
throw new ArgumentNullException(nameof(name));
}
if (configureClient == null)
{
throw new ArgumentNullException(nameof(configureClient));
}
services.AddDaprClient();
var builder = new DefaultDaprClientBuilder(services, name);
builder.ConfigureDaprClient(configureClient);
return builder;
}
#endregion
}
}

26
aspnet-core/modules/dapr/LINGYUN.Abp.Dapr/README.md

@ -0,0 +1,26 @@
# LINGYUN.Abp.Dapr
Dapr 集成基础模块, 实现dapr文档中的命名单例DaprClient
See: https://docs.dapr.io/developing-applications/sdks/dotnet/dotnet-client/dotnet-daprclient-usage
## 配置使用
模块按需引用
```csharp
[DependsOn(typeof(AbpDaprModule))]
public class YouProjectModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
// 创建一个DaprClient
context.Services.AddDaprClient();
// 创建一个具名DaprClient
context.Services.AddDaprClient("__DaprClient");
}
}
```
## 其他
Loading…
Cancel
Save