共用方式為


通訊 SDK 中字串識別碼的使用案例

本文提供在 Azure 通訊服務 SDK 中選擇字串 (Raw ID) 作為 CommunicationIdentifier 型別來表示型別的使用案例。 遵循本指南可協助您了解一些可能會想要透過 CommunicationIdentifier 衍生型別選擇 Raw ID 的使用案例。

選擇識別碼的使用案例

實作通訊案例時,常見的工作是識別交談的參與者。 當您使用通訊服務 SDK 時,CommunicationIdentifier 會提供唯一識別這些參與者的功能。

CommunicationIdentifier 具有下列優點:

  • 在整合式開發環境 (IDE) 中提供良好的自動完成。
  • 允許依型別使用切換案例來解決不同應用程式流程。
  • 允許限制特定型別的通訊。
  • 允許存取標別碼詳細資料,並將其用於呼叫其他 API (例如 Microsoft Graph API),以提供豐富的通訊參與者體驗。

除此之外,CommunicationIdentifier 和衍生型別 (MicrosoftTeamsUserIdentifierPhoneNumberIdentifier 等) 可以轉換成其字串表示法 (Raw ID),並從字串還原以讓下列案例更容易實作:

  • 將識別碼儲存在資料庫中並當成索引鍵使用。
  • 將標別碼當成字典中的索引鍵使用。
  • 在 REST API 路徑中將識別碼當成索引鍵使用來實作直覺式 REST CRUD API,而不是依賴 POST 承載。
  • 在宣告式 UI 架構中將識別碼當成索引鍵使用 (例如 React),以避免不必要的重新轉譯。

建立 CommunicationIdentifier 並擷取 Raw ID

CommunicationIdentifier 可以從 Raw ID 建立,而 Raw ID 可以從衍生自 CommunicationIdentifier 的型別擷取。 其會移除任何自訂序列化方法的需求,此類方法可能只接受特定物件屬性並會省略其他屬性。 舉個例子,MicrosoftTeamsUserIdentifier 有多個屬性如 IsAnonymousCloud 或擷取這些值的方法 (視平台而定)。 使用通訊身分識別 SDK 提供的方法可確保序列化標別碼的方式會保持標準且一致,即便新增更多屬性也會如此。

從 CommunicationUserIdentifier 取得 Raw ID:

public async Task GetRawId()
{
    ChatMessage message = await ChatThreadClient.GetMessageAsync("678f26ef0c");
    CommunicationIdentifier communicationIdentifier = message.Sender;
    String rawId = communicationIdentifier.RawId;
}

從 Raw ID 具現化 CommunicationUserIdentifier:

public void CommunicationIdentifierFromGetRawId()
{
    String rawId = "8:acs:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130";
    CommunicationIdentifier communicationIdentifier = CommunicationIdentifier.FromRawId(rawId);
}

您可以在下列文章中找到更多針對平台的範例:了解識別碼型別

將 CommunicationIdentifier 儲存在資料庫中

您可能需要的其中一個典型作業,就是將 Azure 通訊服務使用者對應至來自 Contoso 使用者資料庫或識別提供者的使用者。 這通常是藉由在 Contoso 使用者 DB 或識別提供者中新增額外的資料行或欄位來達成。 不過,由於 Raw ID 的特性 (穩定、全域唯一且具確定性),您也可以選擇將其當成使用者儲存體的主索引鍵使用。

假設 ContosoUser 是代表您應用程式使用者的類別,而您想要將其連同對應的 CommunicationIdentifier 儲存至資料庫。 CommunicationIdentifier 的原始值可能來自通訊身分識別、電話撥接或聊天 API,又或來自自訂 Contoso API;但不論基礎型別為何,都可以透過程式設計語言中的 string 資料型別表示:

public class ContosoUser
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string CommunicationId { get; set; }
}

您可以存取 CommunicationIdRawId 屬性,以取得可儲存在資料庫中的字串:

public void StoreToDatabase()
{
    CommunicationIdentifier communicationIdentifier;

    ContosoUser user = new ContosoUser()
    {
        Name = "John",
        Email = "john@doe.com",
        CommunicationId = communicationIdentifier.RawId
    };
    SaveToDb(user);
}

如果您想要從儲存的 Raw ID 取得 CommunicationIdentifier,您就必須將原始字串傳遞至 FromRawId() 方法:

public void GetFromDatabase()
{
    ContosoUser user = GetFromDb("john@doe.com");
    CommunicationIdentifier communicationIdentifier = CommunicationIdentifier.FromRawId(user.CommunicationId);
}

其會根據識別碼型別傳回 CommunicationUserIdentifierPhoneNumberIdentifierMicrosoftTeamsUserIdentifierUnknownIdentifier

將 CommunicationIdentifier 儲存在集合中

如果您的案例需要使用數個 CommunicationIdentifier 記憶體中的物件,您可能會想要將其儲存在集合中 (字典、清單、雜湊集等)。 例如,集合有助於維護通話或聊天參與者的清單。 當雜湊邏輯依賴 Raw ID 的值時,您可以在需要元素具有可靠雜湊行為的集合中使用 CommunicationIdentifier。 下列範例示範如何將 CommunicationIdentifier 物件新增至不同型別的集合,並藉由從 Raw ID 值具現化新的識別碼來檢查其是否已包含在集合中。

下列範例示範如何將 Raw ID 當成字典中的索引鍵來儲存使用者的訊息:

public void StoreMessagesForContosoUsers()
{
    var communicationUser = new CommunicationUserIdentifier("8:acs:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130");
    var teamsUserUser = new CommunicationUserIdentifier("45ab2481-1c1c-4005-be24-0ffb879b1130");
    
    // A dictionary with a CommunicationIdentifier as key might be used to store messages of a user.
    var userMessages = new Dictionary<string, List<Message>>
    {
        { communicationUser.RawId, new List<Message>() },
        { teamsUserUser.RawId, new List<Message>() },
    };

    // Retrieve messages for a user based on their Raw ID.
    var messages = userMessages[communicationUser.RawId];
}

當雜湊邏輯依賴 Raw ID 的值時,您可以直接在字典中將 CommunicationIdentifier 當成索引鍵使用:

public void StoreMessagesForContosoUsers()
{
    // A dictionary with a CommunicationIdentifier as key might be used to store messages of a user.
    var userMessages = new Dictionary<CommunicationIdentifier, List<Message>>
    {
        { new CommunicationUserIdentifier("8:acs:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130"), new List<Message>() },
        { new MicrosoftTeamsUserIdentifier("45ab2481-1c1c-4005-be24-0ffb879b1130"), new List<Message>() },
    };

    // Retrieve messages for a user based on their Raw ID.
    var messages = userMessages[CommunicationIdentifier.FromRawId("8:acs:bbbcbc1e-9f06-482a-b5d8-20e3f26ef0cd_45ab2481-1c1c-4005-be24-0ffb879b1130")];
}

依賴 Raw ID 的雜湊邏輯也可讓您將 CommunicationIdentifier 物件新增至雜湊集:

public void StoreUniqueContosoUsers()
{
    // A hash set of unique users of a Contoso application.
    var users = new HashSet<CommunicationIdentifier>
    {
        new PhoneNumberIdentifier("+14255550123"),
        new UnknownIdentifier("28:45ab2481-1c1c-4005-be24-0ffb879b1130")
    };

    // Implement custom flow for a new communication user.
     if (users.Contains(CommunicationIdentifier.FromRawId("4:+14255550123"))){
        //...
     }
}

另一個使用案例是在行動應用程式中使用 Raw ID 來識別參與者。 如果您想要在 UI 程式庫中本機處理此資訊,而非傳送至 Azure 通訊服務,您可以插入遠端參與者的參與者檢視資料。 此檢視資料可以包含 UIimage,其代表要轉譯的頭像,以及可選擇性顯示的顯示名稱。 從中擷取的參與者 CommunicationIdentifier 和 Raw ID 都可用來唯一識別遠端參與者。

callComposite.events.onRemoteParticipantJoined = { identifiers in
  for identifier in identifiers {
    // map identifier to displayName
    let participantViewData = ParticipantViewData(displayName: "<DISPLAY_NAME>")
    callComposite.set(remoteParticipantViewData: participantViewData,
                      for: identifier) { result in
      switch result {
      case .success:
        print("Set participant view data succeeded")
      case .failure(let error):
        print("Set participant view data failed with \(error)")
      }
    }
  }
}    

在 REST API 路徑中將 Raw ID 當成索引鍵使用

設計 REST API 時,您可以使用接受 CommunicationIdentifier 或 Raw ID 字串的端點。 如果識別碼是由數個部分所組成 (例如您使用 MicrosoftTeamsUserIdentifier 的 ObjectID、雲端名稱等),您可能需要在要求本文中傳遞識別碼。 不過,使用 Raw ID 可讓您定址 URL 路徑中的實體,而非將整個複合物件當成本文中的 JSON 傳遞。 因此,您可以擁有更直覺的 REST CRUD API。

public async Task UseIdentifierInPath()
{
    CommunicationIdentifier user = GetFromDb("john@doe.com");
    
    using HttpResponseMessage response = await client.GetAsync($"https://contoso.com/v1.0/users/{user.RawId}/profile");
    response.EnsureSuccessStatusCode();
}

從 Raw ID 擷取識別碼詳細資料。

一致的基礎 Raw ID 可以:

  • 序列化為正確的識別沒碼型別 (視您可以調整的應用程式流程而定)。
  • 擷取識別碼的詳細資料 (例如 MicrosoftTeamsUserIdentifier 的 OID)。

此範例將示範這兩個優點:

  • 讓您決定要從何處取得頭像的型別。
  • 分解的詳細資料可讓您以正確的方式查詢 API。
public void ExtractIdentifierDetails()
{
    ContosoUser user = GetFromDb("john@doe.com");

    string rawId = user.CommunicationIdentifier;
    CommunicationIdentifier teamsUser = CommunicationIdentifier.FromRawId(rawId);
    switch (communicationIdentifier)
    {
        case MicrosoftTeamsUserIdentifier teamsUser:
            string getPhotoUri = $"https://graph.microsoft.com/v1.0/users/{teamsUser.UserId}/photo/$value";
            // ...
            break;
        case CommunicationIdentifier communicationUser:
            string getPhotoUri = GetAvatarFromDB(communicationUser.Id);
            // ...
            break;
    }
}

您可以存取特定 CommunicationIdentifier 的屬性或方法型別,該型別是以字串形式儲存在 Contoso 資料庫中 (Raw ID)。

在 UI 架構中將 Raw ID 當成索引鍵使用

您可以將識別碼的 Raw ID 當成 UI 元件中的索引鍵使用以追蹤特定使用者,並避免不必要的重新轉譯和 API 呼叫。 在此範例中,我們會變更使用者在清單中轉譯的順序。 在真實世界中,我們可能會想要先顯示新使用者,或根據某些條件重新排序使用者 (例如,是否已舉手)。 為了簡單起見,下列範例只會將使用者轉譯的順序反過來。

import { getIdentifierRawId } from '@azure/communication-common';

function CommunicationParticipants() {
  const [users, setUsers] = React.useState([{ id: getIdentifierRawId(userA), name: "John" }, { id: getIdentifierRawId(userB), name: "Jane" }]);
  return (
    <div>
      {users.map((user) => (
      // React uses keys as hints while rendering elements. Each list item should have a key that's unique among its siblings. 
      // Raw ID can be utilized as a such key.
        <ListUser item={user} key={user.id} />
      ))}
      <button onClick={() => setUsers(users.slice().reverse())}>Reverse</button>
    </div>
  );
}

const ListUser = React.memo(function ListUser({ user }) {
  console.log(`Render ${user.name}`);
  return <div>{user.name}</div>;
});

下一步

在本文中,您已了解如何:

  • 正確識別選擇 Raw ID 的使用案例
  • 在 Raw ID 與 CommunicationIdentifier 的不同型別之間轉換

若要深入了解,建議您探索下列快速入門指南: