【问题标题】:Pattern guidance serialised DTO and Generics模式指导序列化 DTO 和泛型
【发布时间】:2021-11-18 07:38:07
【问题描述】:

我正在寻找有关以下目标的最佳模式的指针。

我有多个服务要发送作业,但将包含将形成单独对象 DataObject 的元数据。我正在考虑以下内容

public enum JobType
{
    Job1 = 0,
    Job2 = 1,
    Job3 = 2
}

public class BaseJob
{
    /// <summary>
    /// Unique id maybe a guid
    /// </summary>
    public string Id { get; set; }
}


public interface IJob<T>
{
    /// <summary>
    /// Enumeration of a type of job 
    /// </summary>
    JobType Job { get; set; }

    /// <summary>
    /// Serialized object JsonConvert.SerializeObject(data);
    /// </summary>
    string DataObject { get; set; }
    
    /// <summary>
    /// DeSerialized object of Type T;
    /// </summary>
    T Object { get; }

    /// <summary>
    /// Unique id maybe a guid
    /// </summary>
    string Id { get; set; }

    /// <summary>
    /// Create the job object natively
    /// </summary>
    /// <param name="data"></param>
    void SetJobInfo(T data);
}

public class Job<T>: BaseJob, IJob<T>
{
    /// <inheritdoc/>
    public JobType Job { get; set; }

    /// <inheritdoc/>
    public string DataObject { get; set; }

    [JsonIgnore]
    public T Object => JsonConvert.DeserializeObject<T>(DataObject);

    /// <inheritdoc/>
    public void SetJobInfo(T data)
    {
        DataObject = JsonConvert.SerializeObject(data);
    }
}

我可以使用工厂方法从一个微服务创建相关的作业,但是我如何检查另一个服务的类型是什么。如果可能的话,我试图在多个地方都没有逻辑。

当我从 Job DTO 反序列化 DataObject 时,在 Job 类型中定义 T 的最佳方法是什么?

public void GetJob(IJob<dynamic> job)
{
    switch (job.Job)
    {
       case JobType.Job1:
           // How do I get the T of the object
           var object1 = job.Object;

           // I would like to use T to do something..

           break;
        case JobType.Job2:
           break;
       case JobType.Job3:
           break;
       default:
           throw new ArgumentOutOfRangeException(nameof(job), job, null);
     }
}

谢谢

【问题讨论】:

    标签: c# asp.net object serialization design-patterns


    【解决方案1】:

    使用Newtonsoft 序列化对象时,您可以启用TypeNameHandling,这将添加$type

    var serializedObject = JsonConvert.SerializeObject(myObject, 
    
    Formatting.Indented, new JsonSerializerSettings
    {
        TypeNameHandling = TypeNameHandling.All
    });
    

    在接收微服务中,您将使用:

    var deserializedObject = JsonConvert.SerializeObject(myObject, Formatting.Indented, new JsonSerializerSettings
    {
        TypeNameHandling = TypeNameHandling.Auto
    });
    

    它将存储在对象表示顶部的 JSON 中:

    {
        "$type": "...",
        "Property_1": "...",
        "Property_2": "..."
    }
    

    查看docs中的完整示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 2011-07-29
      相关资源
      最近更新 更多