AppContext Kelas

Definisi

Menyediakan anggota untuk mengatur dan mengambil data tentang konteks aplikasi.

public ref class AppContext abstract sealed
public static class AppContext
type AppContext = class
Public Class AppContext
Warisan
AppContext

Keterangan

Kelas ini AppContext memungkinkan penulis pustaka untuk menyediakan mekanisme penolakan seragam untuk fungsionalitas baru bagi pengguna mereka. Ini menetapkan kontrak yang digabungkan secara longgar antara komponen untuk mengkomunikasikan permintaan penolakan. Kemampuan ini biasanya penting ketika perubahan dilakukan pada fungsionalitas yang ada. Sebaliknya, sudah ada persetujuan implisit untuk fungsionalitas baru.

AppContext untuk pengembang pustaka

Pustaka menggunakan kelas AppContext untuk menentukan dan mengekspos sakelar kompatibilitas, sementara pengguna pustaka dapat menyetel sakelar tersebut untuk memodifikasi perilaku pustaka. Secara bawaan, pustaka menyediakan fungsionalitas baru, dan mereka hanya mengubahnya (yaitu, mereka menyediakan fungsionalitas sebelumnya) jika sakelar diatur. Ini memungkinkan pustaka untuk memberikan perilaku baru untuk API yang ada sambil terus mendukung penelepon yang bergantung pada perilaku sebelumnya.

Tentukan nama sakelar

Cara paling umum untuk memungkinkan konsumen pustaka Anda menolak perubahan perilaku adalah dengan menentukan sakelar bernama. Elemennya value adalah pasangan nama/nilai yang terdiri dari nama sakelar dan nilainya Boolean . Secara default, sakelar selalu beroperasi secara implisit false, yang memberikan perilaku baru (dan membuat perilaku baru ini aktif secara default). Mengatur saklar ke true mengaktifkan fungsi tersebut, yang menyediakan fungsi warisan. Dengan mengatur pengalih ke false secara eksplisit, perilaku baru juga akan disediakan.

Ini bermanfaat untuk menggunakan format yang konsisten untuk nama pengalih, karena mereka adalah kontrak formal yang diekspos oleh perpustakaan. Berikut ini adalah dua format yang jelas:

  • Switch.namespace.switchname
  • Beralih. pustaka. switchname

Setelah Anda menentukan dan mendokumenkan sakelar, penelepon dapat menggunakannya dengan memanggil metode AppContext.SetSwitch(String, Boolean) secara programatis.

Periksa pengaturan

Anda dapat memeriksa apakah pengguna telah menyatakan nilai sakelar dan bertindak dengan tepat dengan memanggil metode AppContext.TryGetSwitch. Metode mengembalikan true jika argumen switchName ditemukan, dan argumen isEnabled menunjukkan nilai sakelar. Jika tidak, metode mengembalikan false.

Example

Contoh berikut mengilustrasikan penggunaan AppContext kelas untuk memungkinkan pelanggan memilih perilaku asli metode pustaka. Berikut ini adalah versi 1.0 dari pustaka bernama StringLibrary. Ini mendefinisikan SubstringStartsAt metode yang melakukan perbandingan ordinal untuk menentukan indeks awal substring dalam string yang lebih besar.

using System;
using System.Reflection;

[assembly: AssemblyVersion("1.0.0.0")]

public static class StringLibrary1
{
    public static int SubstringStartsAt(string fullString, string substr)
    {
        return fullString.IndexOf(substr, StringComparison.Ordinal);
    }
}
open System
open System.Reflection

[<assembly: AssemblyVersion("1.0.0.0")>]
do ()

module StringLibrary =
    let substringStartsAt (fullString: string) (substr: string) =
        fullString.IndexOf(substr, StringComparison.Ordinal)
Imports System.Reflection

<Assembly: AssemblyVersion("1.0.0.0")>

Public Class StringLibrary
   Public Shared Function SubstringStartsAt(fullString As String, substr As String) As Integer
      Return fullString.IndexOf(substr, StringComparison.Ordinal)
   End Function
End Class

Contoh berikut kemudian menggunakan pustaka untuk menemukan indeks awal substring "archæ" dalam "The archaeologist". Karena metode melakukan perbandingan ordinal, substring tidak dapat ditemukan.

using System;

public class Example1
{
    public static void Main()
    {
        string value = "The archaeologist";
        string substring = "archæ";
        int position = StringLibrary1.SubstringStartsAt(value, substring);
        if (position >= 0)
            Console.WriteLine($"'{substring}' found in '{value}' starting at position {position}");
        else
            Console.WriteLine($"'{substring}' not found in '{value}'");
    }
}
// The example displays the following output:
//       'archæ' not found in 'The archaeologist'
let value = "The archaeologist"
let substring = "archæ"

let position =
    StringLibrary.substringStartsAt value substring

if position >= 0 then
    printfn $"'{substring}' found in '{value}' starting at position {position}"
else
    printfn $"'{substring}' not found in '{value}'"

// The example displays the following output:
//       'archæ' not found in 'The archaeologist'
Public Module Example4
    Public Sub Main()
        Dim value As String = "The archaeologist"
        Dim substring As String = "archæ"
        Dim position As Integer = StringLibrary.SubstringStartsAt(value, substring)
        If position >= 0 Then
            Console.WriteLine("'{0}' found in '{1}' starting at position {2}",
                        substring, value, position)
        Else
            Console.WriteLine("'{0}' not found in '{1}'", substring, value)
        End If
    End Sub
End Module
' The example displays the following output:
'       'archæ' not found in 'The archaeologist'

Namun, pustaka versi 2.0 mengubah metode SubstringStartsAt untuk menggunakan perbandingan yang mempertimbangkan budaya.

using System;
using System.Reflection;

[assembly: AssemblyVersion("2.0.0.0")]

public static class StringLibrary2
{
    public static int SubstringStartsAt(string fullString, string substr)
    {
        return fullString.IndexOf(substr, StringComparison.CurrentCulture);
    }
}
open System
open System.Reflection

[<assembly: AssemblyVersion("2.0.0.0")>]
do ()

module StringLibrary =
    let substringStartsAt (fullString: string) (substr: string) =
        fullString.IndexOf(substr, StringComparison.CurrentCulture)
Imports System.Reflection

<Assembly: AssemblyVersion("2.0.0.0")>

Public Class StringLibrary
   Public Shared Function SubstringStartsAt(fullString As String, substr As String) As Integer
      Return fullString.IndexOf(substr, StringComparison.CurrentCulture)
   End Function
End Class

Ketika aplikasi dikompilasi ulang untuk dijalankan dengan versi baru pustaka, sekarang melaporkan bahwa substring "archæ" ditemukan di indeks 4 di "sang arkeolog".

using System;

public class Example2
{
    public static void Main()
    {
        string value = "The archaeologist";
        string substring = "archæ";
        int position = StringLibrary2.SubstringStartsAt(value, substring);
        if (position >= 0)
            Console.WriteLine($"'{substring}' found in '{value}' starting at position {position}");
        else
            Console.WriteLine($"'{substring}' not found in '{value}'");
    }
}
// The example displays the following output:
//       'archæ' found in 'The archaeologist' starting at position 4
let value = "The archaeologist"
let substring = "archæ"

let position =
    StringLibrary.substringStartsAt value substring

if position >= 0 then
    printfn $"'{substring}' found in '{value}' starting at position {position}"
else
    printfn $"'{substring}' not found in '{value}'"

// The example displays the following output:
//       'archæ' found in 'The archaeologist' starting at position 4
Public Module Example6
    Public Sub Main()
        Dim value As String = "The archaeologist"
        Dim substring As String = "archæ"
        Dim position As Integer = StringLibrary.SubstringStartsAt(value, substring)
        If position >= 0 Then
            Console.WriteLine("'{0}' found in '{1}' starting at position {2}",
                        substring, value, position)
        Else
            Console.WriteLine("'{0}' not found in '{1}'", substring, value)
        End If
    End Sub
End Module
' The example displays the following output:
'       'archæ' found in 'The archaeologist' starting at position 4

Perubahan ini dapat dicegah merusak aplikasi yang bergantung pada perilaku asli dengan menentukan sakelar. Dalam hal ini, sakelar diberi nama StringLibrary.DoNotUseCultureSensitiveComparison. Nilai defaultnya, false, menunjukkan bahwa pustaka harus melakukan perbandingan versi 2.0 yang sensitif terhadap budaya. true menunjukkan bahwa pustaka harus melakukan perbandingan ordinal versi 1.0. Sedikit modifikasi kode sebelumnya memungkinkan pengguna pustaka untuk mengatur sakelar guna menentukan jenis perbandingan yang dilakukan oleh metode tersebut.

using System;
using System.Reflection;

[assembly: AssemblyVersion("2.0.0.0")]

public static class StringLibrary
{
   public static int SubstringStartsAt(string fullString, string substr)
   {
      bool flag;
      if (AppContext.TryGetSwitch("StringLibrary.DoNotUseCultureSensitiveComparison", out flag) && flag == true)
         return fullString.IndexOf(substr, StringComparison.Ordinal);
      else
         return fullString.IndexOf(substr, StringComparison.CurrentCulture);
   }
}
open System
open System.Reflection

[<assembly: AssemblyVersion("2.0.0.0")>]
do ()

AppContext.SetSwitch("StringLibrary.DoNotUseCultureSensitiveComparison",true)

module StringLibrary =
    let substringStartsAt (fullString: string) (substr: string) =
        match AppContext.TryGetSwitch "StringLibrary.DoNotUseCultureSensitiveComparison" with 
        | true, true -> fullString.IndexOf(substr, StringComparison.Ordinal)
        | _ -> fullString.IndexOf(substr, StringComparison.CurrentCulture)
Imports System.Reflection

<Assembly: AssemblyVersion("2.0.0.0")>

Public Class StringLibrary
   Public Shared Function SubstringStartsAt(fullString As String, substr As String) As Integer
      Dim flag As Boolean
      If AppContext.TryGetSwitch("StringLibrary.DoNotUseCultureSensitiveComparison", flag) AndAlso flag = True Then
         Return fullString.IndexOf(substr, StringComparison.Ordinal)
      Else
         Return fullString.IndexOf(substr, StringComparison.CurrentCulture)
      End If   
   End Function
End Class

AppContext untuk konsumen pustaka

Jika Anda adalah pengguna pustaka, kelas AppContext memungkinkan Anda untuk memanfaatkan mekanisme pilihan keluar dari pustaka atau metode pustaka untuk fungsionalitas baru. Metode-metode individu dalam perpustakaan kelas yang Anda panggil menentukan sakelar khusus yang mengaktifkan atau menonaktifkan perilaku baru. Nilai sakelar adalah tipe Boolean. Jika adalah false, yang biasanya merupakan nilai default, perilaku baru diaktifkan; jika itu adalah true, perilaku baru dinonaktifkan, dan anggota berulah seperti sebelumnya.

Anda dapat mengatur nilai sakelar dengan memanggil metode AppContext.SetSwitch(String, Boolean) dalam kode Anda. Argumen switchName menentukan nama sakelar, dan isEnabled properti menentukan nilai sakelar. Karena AppContext merupakan kelas statis, kelas ini tersedia berdasarkan domain per aplikasi. Memanggil AppContext.SetSwitch(String, Boolean) memiliki lingkup aplikasi; dengan kata lain, hal ini hanya memengaruhi aplikasi tersebut.

Untuk aplikasi ASP.NET Core, Anda mengatur sakelar dengan menambahkan elemen <Add> ke bagian <appSettings> file web.config. Contohnya:

<appSettings>
   <add key="AppContext.SetSwitch:switchName1" value="switchValue1" />
   <add key="AppContext.SetSwitch:switchName2" value="switchValue2" />
</appSettings>

Jika Anda mengatur sakelar yang sama dengan lebih dari satu cara, urutan prioritas untuk menentukan pengaturan mana yang mengungguli yang lain adalah:

  1. Pengaturan secara programmatik.
  2. Pengaturan dalam file web.config (untuk aplikasi ASP.NET Core).

Properti

Nama Deskripsi
BaseDirectory

Mendapatkan jalur file direktori dasar yang digunakan pemecah masalah perakitan untuk memeriksa rakitan.

TargetFrameworkName

Mendapatkan nama versi kerangka kerja yang ditargetkan oleh aplikasi saat ini.

Metode

Nama Deskripsi
GetData(String)

Mengembalikan nilai elemen data bernama yang ditetapkan ke domain aplikasi saat ini.

SetData(String, Object)

Mengatur nilai elemen data bernama yang ditetapkan ke domain aplikasi saat ini.

SetSwitch(String, Boolean)

Mengatur nilai sakelar.

TryGetSwitch(String, Boolean)

Mencoba untuk mendapatkan nilai sakelar.

Berlaku untuk