.Net 的 DI 有三種方式
以官方的文件描述來看,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
};
}
}