mirror of
https://github.com/alex289/CleanArchitecture.git
synced 2025-06-30 02:31:08 +00:00
Remake the gRPC implementatin properly
This commit is contained in:
parent
c88f38a219
commit
2127925c61
@ -1,7 +1,7 @@
|
||||
using CleanArchitecture.Api.Extensions;
|
||||
using CleanArchitecture.Application.Extensions;
|
||||
using CleanArchitecture.Application.gRPC;
|
||||
using CleanArchitecture.Domain.Extensions;
|
||||
using CleanArchitecture.gRPC;
|
||||
using CleanArchitecture.Infrastructure.Database;
|
||||
using CleanArchitecture.Infrastructure.Extensions;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
|
@ -6,11 +6,12 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.4"/>
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.4" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\CleanArchitecture.Domain\CleanArchitecture.Domain.csproj"/>
|
||||
<ProjectReference Include="..\CleanArchitecture.Domain\CleanArchitecture.Domain.csproj" />
|
||||
<ProjectReference Include="..\CleanArchitecture.Proto\CleanArchitecture.Proto.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
@ -7,7 +7,7 @@ using CleanArchitecture.Proto.Users;
|
||||
using Grpc.Core;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace CleanArchitecture.gRPC;
|
||||
namespace CleanArchitecture.Application.gRPC;
|
||||
|
||||
public sealed class UsersApiImplementation : UsersApi.UsersApiBase
|
||||
{
|
@ -8,4 +8,12 @@ message GrpcUser {
|
||||
string lastName = 4;
|
||||
string email = 5;
|
||||
bool isDeleted = 6;
|
||||
}
|
||||
|
||||
message GetByIdsResult {
|
||||
repeated GrpcUser users = 1;
|
||||
}
|
||||
|
||||
message GetByIdsRequest {
|
||||
repeated string ids = 1;
|
||||
}
|
@ -7,11 +7,3 @@ import "Users/Models.proto";
|
||||
service UsersApi {
|
||||
rpc GetByIds(GetByIdsRequest) returns (GetByIdsResult);
|
||||
}
|
||||
|
||||
message GetByIdsResult {
|
||||
repeated GrpcUser users = 1;
|
||||
}
|
||||
|
||||
message GetByIdsRequest {
|
||||
repeated string ids = 1;
|
||||
}
|
||||
|
8
CleanArchitecture.Shared/CleanArchitecture.Shared.csproj
Normal file
8
CleanArchitecture.Shared/CleanArchitecture.Shared.csproj
Normal file
@ -0,0 +1,8 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
10
CleanArchitecture.Shared/Users/UserViewModel.cs
Normal file
10
CleanArchitecture.Shared/Users/UserViewModel.cs
Normal file
@ -0,0 +1,10 @@
|
||||
using System;
|
||||
|
||||
namespace CleanArchitecture.Shared.Users;
|
||||
|
||||
public sealed record UserViewModel(
|
||||
Guid Id,
|
||||
string Email,
|
||||
string FirstName,
|
||||
string LastName,
|
||||
bool IsDeleted);
|
@ -8,11 +8,11 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="FluentAssertions" Version="6.10.0"/>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0"/>
|
||||
<PackageReference Include="MockQueryable.Moq" Version="7.0.0"/>
|
||||
<PackageReference Include="Moq" Version="4.18.4"/>
|
||||
<PackageReference Include="xunit" Version="2.4.2"/>
|
||||
<PackageReference Include="FluentAssertions" Version="6.10.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
|
||||
<PackageReference Include="MockQueryable.Moq" Version="7.0.0" />
|
||||
<PackageReference Include="Moq" Version="4.18.4" />
|
||||
<PackageReference Include="xunit" Version="2.4.2" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
@ -24,8 +24,9 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\CleanArchitecture.Domain\CleanArchitecture.Domain.csproj"/>
|
||||
<ProjectReference Include="..\CleanArchitecture.gRPC\CleanArchitecture.gRPC.csproj"/>
|
||||
<ProjectReference Include="..\CleanArchitecture.Application\CleanArchitecture.Application.csproj" />
|
||||
<ProjectReference Include="..\CleanArchitecture.Domain\CleanArchitecture.Domain.csproj" />
|
||||
<ProjectReference Include="..\CleanArchitecture.gRPC\CleanArchitecture.gRPC.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using CleanArchitecture.Application.gRPC;
|
||||
using CleanArchitecture.Domain.Entities;
|
||||
using CleanArchitecture.Domain.Enums;
|
||||
using CleanArchitecture.Domain.Interfaces.Repositories;
|
||||
|
15
CleanArchitecture.gRPC/CleanArchitecture.cs
Normal file
15
CleanArchitecture.gRPC/CleanArchitecture.cs
Normal file
@ -0,0 +1,15 @@
|
||||
using CleanArchitecture.gRPC.Interfaces;
|
||||
|
||||
namespace CleanArchitecture.gRPC;
|
||||
|
||||
public sealed class CleanArchitecture : ICleanArchitecture
|
||||
{
|
||||
private readonly IUsersContext _users;
|
||||
|
||||
public IUsersContext Users => _users;
|
||||
|
||||
public CleanArchitecture(IUsersContext users)
|
||||
{
|
||||
_users = users;
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
@ -6,12 +6,9 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\CleanArchitecture.Domain\CleanArchitecture.Domain.csproj"/>
|
||||
<ProjectReference Include="..\CleanArchitecture.Proto\CleanArchitecture.Proto.csproj"/>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.4"/>
|
||||
<ProjectReference Include="..\CleanArchitecture.Domain\CleanArchitecture.Domain.csproj" />
|
||||
<ProjectReference Include="..\CleanArchitecture.Proto\CleanArchitecture.Proto.csproj" />
|
||||
<ProjectReference Include="..\CleanArchitecture.Shared\CleanArchitecture.Shared.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
35
CleanArchitecture.gRPC/Contexts/UsersContext.cs
Normal file
35
CleanArchitecture.gRPC/Contexts/UsersContext.cs
Normal file
@ -0,0 +1,35 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using CleanArchitecture.gRPC.Interfaces;
|
||||
using CleanArchitecture.Proto.Users;
|
||||
using CleanArchitecture.Shared.Users;
|
||||
|
||||
namespace CleanArchitecture.gRPC.Contexts;
|
||||
|
||||
public sealed class UsersContext : IUsersContext
|
||||
{
|
||||
private readonly UsersApi.UsersApiClient _client;
|
||||
|
||||
public UsersContext(UsersApi.UsersApiClient client)
|
||||
{
|
||||
_client = client;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<UserViewModel>> GetUsersByIds(IEnumerable<Guid> ids)
|
||||
{
|
||||
var request = new GetByIdsRequest();
|
||||
|
||||
request.Ids.AddRange(ids.Select(id => id.ToString()));
|
||||
|
||||
var result = await _client.GetByIdsAsync(request);
|
||||
|
||||
return result.Users.Select(user => new UserViewModel(
|
||||
Guid.Parse(user.Id),
|
||||
user.Email,
|
||||
user.FirstName,
|
||||
user.LastName,
|
||||
user.IsDeleted));
|
||||
}
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
using CleanArchitecture.gRPC.Contexts;
|
||||
using CleanArchitecture.gRPC.Interfaces;
|
||||
using CleanArchitecture.gRPC.Models;
|
||||
using CleanArchitecture.Proto.Users;
|
||||
using Grpc.Net.Client;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
namespace CleanArchitecture.gRPC.Extensions;
|
||||
|
||||
public static class ServiceCollectionExtensions
|
||||
{
|
||||
public static IServiceCollection AddGrpcClient(
|
||||
this IServiceCollection services,
|
||||
IConfiguration configuration,
|
||||
string configSectionKey = "gRPC")
|
||||
{
|
||||
var settings = new GRPCSettings();
|
||||
configuration.Bind(configSectionKey, settings);
|
||||
|
||||
return AddGrpcClient(services, settings);
|
||||
}
|
||||
|
||||
public static IServiceCollection AddGrpcClient(this IServiceCollection services, GRPCSettings settings)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(settings.CleanArchitectureUrl))
|
||||
{
|
||||
services.AddCleanArchitectureGrpcClient(settings.CleanArchitectureUrl);
|
||||
}
|
||||
|
||||
services.AddSingleton<ICleanArchitecture, CleanArchitecture>();
|
||||
|
||||
return services;
|
||||
}
|
||||
|
||||
public static IServiceCollection AddCleanArchitectureGrpcClient(
|
||||
this IServiceCollection services,
|
||||
string tetraQueryApiUrl)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(tetraQueryApiUrl))
|
||||
{
|
||||
return services;
|
||||
}
|
||||
|
||||
var channel = GrpcChannel.ForAddress(tetraQueryApiUrl);
|
||||
|
||||
var usersClient = new UsersApi.UsersApiClient(channel);
|
||||
services.AddSingleton(usersClient);
|
||||
|
||||
services.AddSingleton<IUsersContext, UsersContext>();
|
||||
|
||||
return services;
|
||||
}
|
||||
}
|
9
CleanArchitecture.gRPC/ICleanArchitecture.cs
Normal file
9
CleanArchitecture.gRPC/ICleanArchitecture.cs
Normal file
@ -0,0 +1,9 @@
|
||||
using System;
|
||||
using CleanArchitecture.gRPC.Interfaces;
|
||||
|
||||
namespace CleanArchitecture.gRPC;
|
||||
|
||||
public interface ICleanArchitecture
|
||||
{
|
||||
IUsersContext Users { get; }
|
||||
}
|
11
CleanArchitecture.gRPC/Interfaces/IUsersContext.cs
Normal file
11
CleanArchitecture.gRPC/Interfaces/IUsersContext.cs
Normal file
@ -0,0 +1,11 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using CleanArchitecture.Shared.Users;
|
||||
|
||||
namespace CleanArchitecture.gRPC.Interfaces;
|
||||
|
||||
public interface IUsersContext
|
||||
{
|
||||
Task<IEnumerable<UserViewModel>> GetUsersByIds(IEnumerable<Guid> ids);
|
||||
}
|
6
CleanArchitecture.gRPC/Models/GRPCSettings.cs
Normal file
6
CleanArchitecture.gRPC/Models/GRPCSettings.cs
Normal file
@ -0,0 +1,6 @@
|
||||
namespace CleanArchitecture.gRPC.Models;
|
||||
|
||||
public sealed class GRPCSettings
|
||||
{
|
||||
public string CleanArchitectureUrl { get; set; } = string.Empty;
|
||||
}
|
@ -27,6 +27,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CleanArchitecture.gRPC.Test
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{D3DF9DF5-BD7D-48BC-8BE6-DBD0FABB8B45}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CleanArchitecture.Shared", "CleanArchitecture.Shared\CleanArchitecture.Shared.csproj", "{E82B473D-0281-4713-9550-7D3FF7D9CFDE}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@ -77,6 +79,10 @@ Global
|
||||
{E3A836DD-85DB-44FD-BC19-DDFE111D9EB0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E3A836DD-85DB-44FD-BC19-DDFE111D9EB0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E3A836DD-85DB-44FD-BC19-DDFE111D9EB0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{E82B473D-0281-4713-9550-7D3FF7D9CFDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E82B473D-0281-4713-9550-7D3FF7D9CFDE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E82B473D-0281-4713-9550-7D3FF7D9CFDE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E82B473D-0281-4713-9550-7D3FF7D9CFDE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
@ -88,4 +94,7 @@ Global
|
||||
{39732BD4-909F-410C-8737-1F9FE3E269A7} = {D3DF9DF5-BD7D-48BC-8BE6-DBD0FABB8B45}
|
||||
{E3A836DD-85DB-44FD-BC19-DDFE111D9EB0} = {D3DF9DF5-BD7D-48BC-8BE6-DBD0FABB8B45}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {DDAAEEA0-FB1B-4EAD-902B-C12034FFC17A}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
Loading…
Reference in New Issue
Block a user