iT邦幫忙

2025 iThome 鐵人賽

DAY 26
1
Software Development

30 天的 .Net gRPC 迷途系列 第 26

Day26 gRPC 整合 .Net DI 服務

  • 分享至 

  • xImage
  •  

.Net 的 DI 有三種方式

  • Scoped 隨 Request 註冊
  • Singleton 隨站台
  • Transient 一使用就 New

以官方的文件描述來看,gRPC 的服務屬於 Scoped

// gRPC 服務
app.MapGrpcService<GreeterService>();

所以在跟 gRPC 的服務共同使用的時候,盡量以 Scoped、Transient 做使用

在使用 DI 註冊的服務如下

建立一個 IUserRepository.cs 並實作

public interface IUserRepository
{
    Task<(bool IsSuccess, string Msg)> FindUser(string userId);
}

public class UserRepository : IUserRepository
{
    public Task<(bool IsSuccess, string Msg)> FindUser(string userId)
    {
        return Task.FromResult(userId == "0001"
            ? (true, "")
            : (false, "Not Found"));
    }
}

Program.cs 下註冊

//..
builder.Services.AddScoped<IUserRepository, UserRepository>();

gRPC 服務的建構下註冊使用

public class UserService : MyGrpcServer.UserService.UserServiceBase
{
    private readonly IUserRepository _userRepository;
    public UserService(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public override async Task<GetUserResponse> GetUser(GetUserRequest request, ServerCallContext context)
    {
        var res = await _userRepository.FindUser(request.UserId);

        if (!res.IsSuccess)
        {
            throw new RpcException(new Grpc.Core.Status(Grpc.Core.StatusCode.NotFound, res.Msg ?? "User not found"));
        }

        return new GetUserResponse()
        {
            User = new User { Age = 30, Name = "John Doe" },
            Status = Status.Active
        };
    }
}

上一篇
Day25 gRPC Gateway
系列文
30 天的 .Net gRPC 迷途26
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言