Saya akan melalui kode berikut:

public interface IBus
{
  Task Publish(BaseMessage message,string topicName);
}

Basemessage adalah:

public class BaseMessage
{
  public Guid Id {get;set;}
  public DateTime CreationDateTime{get;set;}
}

Ada kelas yang mengimplementasikan IBUS

public class AzureServiceBusMessageBus : IBus
{
  public async Task Publish(BaseMessage message,string topicName)
  {
    ISenderClient topic = new TopicClient(message,topicName);
    
    var jsonMess = JsonConvert.SerializeObject(message);
    var serviceBusMessage = new Message(Encoding.UTF8.GetBytes(jsonMessage))
    {
      CorrelationId = Guid.NewGuid().ToString()
    }
   await topicClient.Sendasync(serviceBusMessage);
  }

Kode berikut adalah dari pengontrol klien:

public BasketCheckOutMessage : BaseMessage
{
 public string FirstName {get;set;}
}

public Task CheckController(IBus messageBus)
{
  ...
   BasketCheckOutMessage basket = new BasketCheckOutMessage ();
   try
   {
    await messageBus.Publish(basket ,"checkout");
   }
   catch(Exception e)
   {
   }
}

Di sini, saya tidak mengerti satu hal:

Apa tujuan melintas " keranjang " objek dalam clientController sedangkan itu diterima sebagai " basemessage " objek dasar dalam mempublikasikan (). Pemahaman saya adalah ini adalah kode yang berlebihan karena jika kita mengatur firstname = "A" di BasketcheckoutMessage dari kode klien dalam clientController dan lulus ke metode "Terbitkan", itu tidak akan diterima karena argumen referensi ( Basemessage).

Apakah saya mengerti salah dalam konteks ini?

0
User1267 4 April 2021, 09:35

1 menjawab

Jawaban Terbaik

Ya, pemahaman Anda perlu sedikit tweak.

Ketika Anda melewati objek turunan, Anda memang meneruskannya, dengan semua bidangnya dan data lainnya.

Namun, penerimaan dapat mengharapkan kelas dasar, tetapi jika penerima "melihat ke dalamnya", misalnya, melemparkan message ke BasketCheckOutMessage, itu akan dapat menggunakan semua anggotanya. Panggilan message.GetType() juga akan menghasilkan output typeof(BasketCheckOutMessage).

Hal lain adalah refleksi C #. Metode JsonConvert.SerializeObject akan menyelidiki properti mana pada anggota input yang tersedia untuk serialisasi, dan itu akan menemukan anggota FirstName, karena itu di sana.

0
AgentFire 5 April 2021, 07:12