Golang и gRPC Marshal / Unmarshal или ручной подход - PullRequest
0 голосов
/ 24 октября 2018

Следуя «чистой архитектуре», я сейчас реализую пакет доставки gRPC для взаимодействия с моими менеджерами (службами).Объекты моего домена определены как чистые структуры Go с тегами json.Уровень хранения имеет свои собственные определения объектов, чтобы разрешить пользовательские типы (такие как sql.NullInt64).Здесь я использую ручной подход для преобразования сущностей домена в типы sql и наоборот.Со стороны обработчика я вижу, что появляется та же самая картина.Я должен конвертировать из / в типы gRPC.

структура сущности gRPC <-> структура сущности домена <-> структура сущности SQL

Я проверил следующее и, похоже, работает:

func (h *RPCHandler) DescribeRealm(ctx context.Context, in
*pb.DescribeRealmReq) (*pb.DescribeRealmResp, error) {

rlm, err := h.Manager.DescribeRealm(ctx, in.GetRealmId())
if err != nil {
    return nil, err
}

jb, err := json.Marshal(rlm)
if err != nil {
    return nil, err
}

r := &pb.Realm{}
if err := jsonpb.Unmarshal(bytes.NewReader(jb), r); err != nil {
    return nil, err
}

return &pb.DescribeRealmResp{
    Realm: r,
}, nil

Мой вопрос заключается в следующем:

Является ли это предпочтительным способом преобразования данных между различными типами структур / слоев, или мне следует придерживаться ручного подхода?

С наилучшими пожеланиями, Карл.

...