Bagikan melalui


Penerusan jenis dalam runtime bahasa umum

Penerusan jenis memungkinkan Anda untuk memindahkan jenis ke rakitan lain tanpa harus mengompilasi ulang aplikasi yang menggunakan rakitan asli.

Misalnya, aplikasi menggunakan kelas Example dalam rakitan bernama Utility.dll. Pengembang Utility.dll mungkin memutuskan untuk merefaktor rakitan, dan dalam prosesnya mereka mungkin memindahkan kelas Example ke rakitan lain. Jika versi lama Utility.dll digantikan oleh versi baru Utility.dll dan rakitan pendampingnya, aplikasi yang menggunakan kelas Example gagal karena tidak dapat menemukan kelas Example dalam versi baru Utility.dll.

Pengembang Utility.dll dapat menghindari hal ini dengan meneruskan permintaan untuk kelas Example, menggunakan atribut TypeForwardedToAttribute. Jika atribut telah diterapkan ke versi baru Utility.dll, permintaan untuk kelas Example diteruskan ke rakitan yang sekarang berisi kelas tersebut. Aplikasi yang ada terus berfungsi normal, tanpa rekompilasi.

Meneruskan jenis

Ada empat langkah untuk meneruskan jenis:

  1. Pindahkan kode sumber untuk jenis dari rakitan asli ke rakitan tujuan.

  2. Dalam rakitan di mana jenisnya dulu berada, tambahkan TypeForwardedToAttribute untuk jenis yang dipindahkan. Kode berikut menunjukkan atribut untuk jenis bernama Example yang dipindahkan.

     [assembly:TypeForwardedToAttribute(Example::typeid)]
    
     [assembly:TypeForwardedToAttribute(typeof(Example))]
    
  3. Kompilasi rakitan yang sekarang berisi jenis tersebut.

  4. Kompilasi ulang rakitan tempat jenis dulu berada, dengan referensi ke rakitan yang sekarang berisi jenisnya. Misalnya, jika Anda mengompilasi file C# dari baris perintah, gunakan opsi Referensi (opsi pengompilasi C#) untuk menentukan rakitan yang berisi jenis. Di C++, gunakan arahan #using dalam file sumber untuk menentukan rakitan yang berisi jenis.

Contoh penerusan jenis C#

Melanjutkan dari contoh deskripsi buatan di atas, bayangkan Anda mengembangkan Utility.dll, dan Anda memiliki kelas Example. Utility.csproj adalah pustaka kelas dasar:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsing>true</ImplicitUsing>
  </PropertyGroup>

</Project>

Kelas Example menyediakan beberapa properti dan menimpa Object.ToString:

using System;

namespace Common.Objects;

public class Example
{
    public string Message { get; init; } = "Hi friends!";

    public Guid Id { get; init; } = Guid.NewGuid();

    public DateOnly Date { get; init; } = DateOnly.FromDateTime(DateTime.Today);

    public sealed override string ToString() =>
        $"[{Id} - {Date}]: {Message}";
}

Sekarang, bayangkan bahwa ada proyek yang mengonsumsi dan diwakili dalam rakitan Konsumen. Proyek pengonsumsi ini mereferensikan rakitan Utilitas. Sebagai contoh, ini membuat instans objek Example dan menulisnya ke konsol dalam file Program.cs-nya:

using System;
using Common.Objects;

Example example = new();

Console.WriteLine(example);

Saat aplikasi yang mengonsumsi berjalan, aplikasi tersebut akan menghasilkan status objek Example. Pada titik ini, tidak ada penerusan jenis karena Consuming.csproj mereferensikan Utility.csproj. Namun, pengembang dari rakitan Utilitas memutuskan untuk menghapus objek Example sebagai bagian dari refaktor. Jenis ini dipindahkan ke Common.csproj yang baru dibuat.

Dengan menghapus jenis ini dari perakitan Utilitas, pengembang memperkenalkan perubahan yang melanggar. Semua proyek yang mengonsumsi akan rusak ketika diperbarui ke rakitan Utilitas terbaru.

Alih-alih mengharuskan proyek pengonsumsi untuk menambahkan referensi baru ke perakitan Umum, Anda dapat meneruskan jenisnya. Karena jenis ini dihapus dari rakitan Utilitas, Anda harus membuat Utility.csproj mereferensikan Common.csproj:

<ItemGroup>
  <ProjectReference Include="..\Common\Common.csproj" />
</ItemGroup>

Proyek C# sebelumnya sekarang mereferensikan rakitan Umum yang baru dibuat. Ini bisa berupa PackageReference atau ProjectReference. Rakitan Utilitas perlu memberikan informasi penerusan jenis. Berdasarkan konvens,i deklarasi penerusan jenis biasanya dirangkum dalam satu file bernama TypeForwarders, pertimbangkan file C# TypeForwarders.cs berikut di rakitan Utilitas:

using System.Runtime.CompilerServices;
using Common.Objects;

[assembly:TypeForwardedTo(typeof(Example))]

Rakitan Utilitas mereferensikan rakitan Umum, dan meneruskan jenis Example. Jika Anda mengompilasi rakitan Utilitas dengan deklarasi penerusan jenis dan menjatuhkan Utility.dll ke dalam tempat Konsumsi, aplikasi yang mengonsumsi akan berfungsi tanpa dikompilasi.

Lihat juga