我正在創建使用多個 gRPC CRUD 服務的 WPF 應用程式。通常,我會創建一個 GrpcChannel 實體并使用此通道填充 gRPC 客戶端,將它們傳遞給 DI 容器以在 ViewModel 中進一步使用。
但問題是我的 WPF 應用程式有某種“啟動視窗”,用戶必須在其中提供服務器憑據(ip 和埠)才能連接。這個事實導致我無法使用 gRPC 客戶端實體化 GrpcChannel 并在應用程式實際啟動之前將它們傳遞給 DI 容器的問題。我應該在用戶傳遞服務器憑據后以某種方式創建 GrpcChannel 并將此通道重用于所有 gRPC 客戶端。
那么,問題是如何正確管理應該在運行時使用用戶憑據創建通道的情況?
uj5u.com熱心網友回復:
這些選項怎么樣?
選項 1 - 在呼叫 gRPC 之前檢查空憑據(這就是我所做的)
public interface IGrpcCredentials
{
string? GetIP();
int? GetPort();
}
用法
public void TryCallGrpcService(){
IGrpcCredentials credentials; //pretend this has been passed here from somewhere
var ip = credentials.GetIP();
if(ip is null){
return;
}
var port = credentials.GetPort();
if(port is null){
return;
}
CallGrpcService((string)ip, (int)port);
}
選項 2 - 使用占位符服務初始化 DI
您可以使用不提供憑據的占位符服務來初始化 DI。例如:
public interface IGrpcCredentials
{
bool AreCredentialsAvailable();
string GetIP();
int GetPort();
}
public class RealGrpcCredentials
{
private readonly string _ip;
private readonly int _port;
public RealGrpcCredentials(string ip, int port)
{
_ip = ip;
_port = port;
}
bool AreCredentialsAvailable() => true;
string GetIP() => _ip;
int GetPort() => _port;
}
public class PlaceholderGrpcCredentials
{
bool AreCredentialsAvailable() => false;
string GetIP() => return string.Empty;
int GetPort() => return -1;
}
用法
// register palceholder before knowing the credentials
container.Register<IGrpcCredentials, PlaceholderGrpcCredentials>();
//ask user for their crednetials
var credentials = ShowUserCredentialsDialog();
//register the actual credentials
container.Register<IGrpcCredentials, RealGrpcCredentials>(new RealGrpcCredentials(credentials.Ip, credentials.Port));
選項 3 - 在用戶輸入憑據后初始化 DI
在初始化 DI 容器之前等待用戶填寫他們的憑據。您必須創建一個不依賴于 DI 并且可以在構建 DI 容器之前啟動的啟動視窗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/330493.html
