gpt4 book ai didi

c# - 具有接口(interface)属性的 MassTransit 发送命令

转载 作者:行者123 更新时间:2023-12-01 21:20:37 26 4
gpt4 key购买 nike

我在我的项目中使用 MassTransit,并且尝试发送一个内部具有接口(interface)属性的命令。我将 ICreateDocumentCommand 命令中的 Document 属性设置为 InventoryList。它发送它没有任何问题。但是当我收到它时,我在接收端得到一个 GreenPipes.DynamicInternal.Common.Models.IDocument

IDocument 仅包含 Document 类型的属性,它没有 InventoryList 类的属性。 基本上我只传输 Id、AuthorId 和 DateCreated,而不传输 WarehouseId 和所有其余属性来自库存列表。

我的所有类实际上都在 Common.Models 内,但我更喜欢获取 Common.Models.InventoryList 而不是 IDocument。

这就是我发送命令的方式:

await endPoint.Send<ICreateDocumentCommand>(new
{
CorrelationId = //from outside
SocketId = //from outside
UserName = //from outside
UserId = //from outside
Document = //from outside (InventoryList)
});

命令定义如下:

public interface ICommand
{
Guid CorrelationId { get; set; }
Guid SocketId { get; set; }
string UserName { get; set; }
Guid UserId { get; set; }
}

public class Command : ICommand
{
public Command() {}

public Guid CorrelationId { get; set; }
public Guid SocketId { get; set; }
public string UserName { get; set; }
public Guid UserId { get; set; }
}

public interface ICreateDocumentCommand : ICommand
{
IDocument Document { get; set; }
}

public class CreateDocumentCommand : Command, ICreateDocumentCommand
{
public CreateDocumentCommand() {}

public IDocument Document { get; set; }
}

那是命令,现在是 IDocument:

public interface IDocument
{
Guid Id { get; set; }
Guid AuthorId { get; set; }
DateTime DateCreated { get; set; }
}

public class Document : IDocument
{
public Document() {}

public Guid Id { get; set; }
public Guid AuthorId { get; set; }
public DateTime DateCreated { get; set; } = DateTime.Now;
}

最后是库存列表:

public class InventoryList : Document
{
public InventoryList() {}

public Guid WarehouseId { get; set; }
public string Copmany { get; set; }
public Guid ResponsiblePersonId { get; set; }
public Guid FirstCommissionMemberId { get; set; }
public Guid SecondCommissionMemberId { get; set; }
}

最佳答案

这更多的是一个基本的序列化问题。当您反序列化ICreateDocumentCommand时,它会将IDocument反序列化为IDocument——即接口(interface)。这是因为无法从接口(interface)定义中知道哪个具体类型应该隐藏在 IDocument 后面。

这是一篇不错的博客文章,详细介绍了问题和解决方案:http://appetere.com/post/serializing-interfaces-with-jsonnet .

  1. 您还可以在您的消费者上添加自定义序列化程序以正确反序列化它,这会导致很多麻烦。

  2. 如果您可以使用抽象类而不是接口(interface),那么有一个简单的解决方案。只需重新设计您的代码,如下所示:

    public class CreateDocumentCommand : Command, ICreateDocumentCommand
    {
    public CreateDocumentCommand()
    {

    }

    [JsonProperty(ItemTypeNameHandling = TypeNameHandling.Auto)]
    public DocumentBase Document { get; set; }
    }

    public abstract class DocumentBase
    {
    public Guid Id { get; set; }

    public Guid AuthorId { get; set; }

    public abstract DateTime DateCreated { get; set; }
    }
    public class Document : DocumentBase
    {
    public override DateTime DateCreated { get; set; } = DateTime.Now;
    }

关于c# - 具有接口(interface)属性的 MassTransit 发送命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50619428/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com