Skip to content

重新设计WithMetadata(替换为Context), 移除对业务对象的侵入性。#4

Open
piyongcai wants to merge 2 commits intodeeyi2000:mainfrom
piyongcai:main
Open

重新设计WithMetadata(替换为Context), 移除对业务对象的侵入性。#4
piyongcai wants to merge 2 commits intodeeyi2000:mainfrom
piyongcai:main

Conversation

@piyongcai
Copy link
Contributor

1、WithMetadata增加增加 IEnumerable 接口实现, 方便调用
2、Json序列化变更为 Utf8Json。因为在System.Text.Json序列化Message WithMetadata 时会崩溃。
3、examples/Program.cs增加打印结果函数。

2、Json序列化变更为 Utf8Json。因为在System.Text.Json序列化Message WithMetadata 时会崩溃。
3、examples/Program.cs增加打印结果函数。
@deeyi2000
Copy link
Owner

2、Json序列化变更为 Utf8Json。因为在System.Text.Json序列化Message WithMetadata 时会崩溃。
没有发现System.Text.Json序列化Message WithMetadata 崩溃问题;
且Utf8Json已较长时间未更新,不建议使用

@piyongcai
Copy link
Contributor Author

2、Json序列化变更为 Utf8Json。因为在System.Text.Json序列化Message WithMetadata 时会崩溃。
没有发现System.Text.Json序列化Message WithMetadata 崩溃问题;
且Utf8Json已较长时间未更新,不建议使用

按你设计的逻辑,参数和返回结果继承于WithMetadata,就可以带Metadata了,我写了如下测试

 public class Args : WithMetadata {
        public long A { get; set; }
        public long B { get; set; }
   }

public class Reply : WithMetadata {
        public long C { get; set; }
    }

// 然后调用就崩溃了,是json序列化崩溃出来的

@deeyi2000
Copy link
Owner

请展示更完整的测试代码和异常详细内容

@piyongcai
Copy link
Contributor Author

请展示更完整的测试代码和异常详细内容

  1. WithMetadata实现IEnumerable<KeyValuePair<string, string>>接口: WithMetadata
  2. example 代码中,参数从WithMetadata继承 Program.cs,注意修改序列化为json
  3. 测试,报错

@deeyi2000
Copy link
Owner

deeyi2000 commented Nov 1, 2021

经测试,应该是IEnumerable<KeyValuePair<string, string>>接口的问题。
并且我的理解WithMetadata实现IEnumerable<KeyValuePair<string, string>>接口是为了使用时会如下:

public class Args : WithMetadata {
        public long A { get; set; }
        public long B { get; set; }
}
//...
foreach(KeyValuePair<string, string> kv in args) {
}

这时foreach会产生歧义,是在遍历Args的成员变量,而不是MetaData
因此建议采用以下方法实现

 public abstract class WithMetadata
    {
        public virtual Dictionary<string, string> GetMetaData() => _metadata;
    }

foreach (KeyValuePair<string, string> kv in r1.GetMetaData()) {
}

2, 增加 Context.cs, 实现上下文基本类。
3, 修改IRPCClient -> Go, 加入上下文参数
4, TaskCompletionSource.cs 中, 将Message缓存起来
5, Client.cs -> ChannelRead0 -> 增加对返回结果上下文处理。
6, Program.cs 中, 修订测试代码。
@piyongcai
Copy link
Contributor Author

经测试,应该是IEnumerable<KeyValuePair<string, string>>接口的问题。 并且我的理解WithMetadata实现IEnumerable<KeyValuePair<string, string>>接口是为了使用时会如下:

public class Args : WithMetadata {
        public long A { get; set; }
        public long B { get; set; }
}
//...
foreach(KeyValuePair<string, string> kv in args) {
}

这时foreach会产生歧义,是在遍历Args的成员变量,而不是MetaData 因此建议采用以下方法实现

 public abstract class WithMetadata
    {
        public virtual Dictionary<string, string> GetMetaData() => _metadata;
    }

foreach (KeyValuePair<string, string> kv in r1.GetMetaData()) {
}

感觉Metadata设计有点不合理,对业务对象定义侵入性太强。
我正在参考golang context设计,看看有无办法重构一个版本出来。

另外,你看你有时间的话,能否将服务发现这块完善一下,这块我不太熟悉。

@piyongcai piyongcai changed the title WithMetadata And UTF8Json 重新设计WithMetadata(替换为Context), 移除对业务对象的侵入性。 Nov 8, 2021
@deeyi2000
Copy link
Owner

服务发现部分已经全部都实现好了,测试后我会提交上来

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants