7

我有一个react-redux应用程序,我的团队使用grpc-web。我想知道 - 设计这种系统的最佳方法是什么?

目前计划是创建 3 个抽象级别:

  1. APIgrpc-web模块 -客户周围的承诺包装器
  2. Redux thunkslevel - 处理 API 的异步操作创建者
  3. React components props- 将只询问组件需要什么

所以components一无所知grpc,他们与动作创建者混为一谈,动作创建者一无所知grpc,他们处理一个api模块,并且只有api模块与grpc-web存根一起使用。

我想走这条路的原因:

  • 动作创建者和组件中没有特定于 grpc 的代码
  • 我的基于 Promise 的 API 而不是 grpc-web 的基于回调的 API

我的问题是:

  1. 在 Redux 和 grpc-web 之间有一个抽象级别是个好主意吗?或者最好将这些东西保留在动作创建者的逻辑中?
  2. 我应该考虑一个通用的设计模式吗?(我在考虑“适配器”)
  3. grpc-web承诺API是个好主意吗?如果是的话,编写一个函数并即时执行是个好主意吗?
  4. 我可以说我目前的计划是适配器模式吗?
  5. 如果我想使用适配器模式,我是否必须将数据收集的每个元素映射到我自己的接口?我知道我的组件(可能还有动作创建者)不应该依赖grpc-webAPI,因为这个 API 将来可能会改变
4

2 回答 2

0

我在 redux thunk 上使用 grpc-web,下面的示例代码来自动作创建者:

export const getStudentInfo = (id) => async dispatch => {

const request = new StudentRequest();
request.setId("555");
var metadata = { 'token': 'value1' };
var URL = "https://localhost:5001";
var client = new StudentClient(URL);
var call = client.getStudentInformation(request, metadata, function (err, response) {

    if (err) {
        console.log(err.code);
        console.log(err.message);
    } else {
        dispatch({ type: STUDENT_INFO, payload: response.getMessage() })
    }
});
call.on('status', function (status) {
    //console.log(status.details);
});

};
于 2020-09-16T15:26:14.683 回答
0

恕我直言,您使用哪种技术在网络上编码数据并不重要,将其封装在应用程序中的某种服务中总是一个好主意。所以回答你的问题:

在 Redux 和 grpc-web 之间有一个抽象级别是个好主意吗?或者最好将这些东西保留在动作创建者的逻辑中?

的,将 Redux 细节与网络细节分离绝对是一个好主意。这样,如果您的团队决定将 grpc 更改为其他技术,您只需要更改服务的代码(尽管在我的职业生涯中实际上从未发生过)。

我应该考虑一个通用的设计模式吗?(我在考虑“适配器”)

承诺 grpc-web API 是个好主意吗?如果是的话,编写一个函数并即时执行是个好主意吗?

我不确定您在这里所说的“即时”是什么,但我猜代码应该如下所示:

// client should probably exist in only instance, right? Consider using DI container for that
var client = new GreeterClient('http://' + window.location.hostname + ':8080', null, null);

// simple unary call
class ApiAbstractionService {
    construct(client) {
        this.client = client;
    }
    
    sayHello() => {
        return new Promise((resolve, reject) => {
            this.client.sayHello(request, {}, (err, response) => {
                if (err) {
                    reject(err.message);
                } else {
                    resolve(response.getMessage());
                }
            });
        })
    }
}

我可以说我目前的计划是适配器模式吗?

当您有两种服务时,通常会使用适配器,例如,具有不同的接口并且您希望将其统一。我个人会说 -

如果我想使用适配器模式,我是否必须将数据收集的每个元素映射到我自己的接口?我知道我的组件(可能还有动作创建者)不应该依赖于 grpc-web API,因为这个 API 将来可能会改变

再一次——如果你不确定你选择的设计模式是否完全符合你的需求——那就不要使用它。模式应该帮助你,而不是强迫你进入你不需要的限制。

于 2022-01-31T14:41:33.343 回答