.NET MAUI Kullanarak C#'ta Barkod Nasıl Okunur & Taranır
#InfragisticsBarkod'dan IronBarcode'a Geçiş
ÇoğuInfragisticsbarkod geçişi, ekip yalnızca barkod üretimi sağlanan bir projede barkod okuma gereksinimi olduğu için olur — WinForms,ASP.NET Coreveya WPF dışındaki herhangi bir projede — ya da olay güdümlü WPF okuyucu API'si üretim kullanımı için çok kırılgan olduğunu kanıtladığından dolayı. TaskCompletionSource köprü deseni, eşzamanlı çağrıları güvensiz hale getiren ortak _result alanı ve eksik SymbologyType bayraklarından kaynaklanan sessiz hatalar, ekiplerin alternatif aramasının yaygın nedenleridir.
Bu kılavuz,Infragisticsbarkod paketlerini kaldırma, hem WinForms hem WPF bağlamlarındaki üretim ve okuma kodunu değiştirme ve Infragistics'in hiç destek sağlamadığı proje türlerine barkod işlevselliği ekleme konularında tüm geçiş sürecini anlatır.
Hızlı Başlangıç
1. Adım:InfragisticsBarkod Paketlerini Kaldırma
ProjenizdenInfragisticsbarkod NuGet paketlerini kaldırın. Hangi hedefleri kullandığınıza bağlı olarak,
# WinForms generation package
dotnet remove package Infragistics.WinForms.Barcode
# WPF reading package
dotnet remove package Infragistics.WPF.BarcodeReader
Eğer proje dosyanız her iki referansı da içeriyorsa, ikisini de kaldırın. Eğer başkaInfragisticsbileşenleri kullanıyorsanız, barkod spesifik paketlerin kaldırılması,InfragisticsUltimate lisansını etkilemez.
2. Adım: IronBarcode'u Kurun
dotnet add package IronBarcode
IronBarcode, WinForms, WPF, ASP.NET Core, konsol, Blazor Sunucu, Docker, Azure İşlevleri ve AWS Lambda genelinde çalışan tek bir pakettir. Çerçevenin başına ayrı paketler gerekmemektedir.
3. Adım: Namespace'leri Güncelleme
Infragistics barkod ad alanlarını IronBarCode (büyük B, büyük C) ile değiştirin:
// Remove these:
// using Infragistics.Win.UltraWinBarcode;
// using Infragistics.Controls.Barcodes;
// using System.Windows.Media.Imaging; // if only used for barcode BitmapImage loading
// Add this:
using IronBarCode;Imports IronBarCode4. Adım: Lisansı Başlatma
Lisans başlatma işlemini uygulama başlangıcında bir kez ekleyin — Program.cs, App.xaml.cs veya DI kompozisyon kökünüz:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"Kod Göç Örnekleri
WinForms Üretim: UltraWinBarcode'dan BarcodeWriter'a
WinForms oluşturma deseni, IronBarcode'un BarcodeWriter ile temiz bir şekilde eşlenir:
Önce (Infragistics WinForms):
using Infragistics.Win.UltraWinBarcode;
var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);Imports Infragistics.Win.UltraWinBarcode
Dim barcode As New UltraWinBarcode()
barcode.Symbology = Symbology.Code128
barcode.Data = "ITEM-12345"
barcode.SaveTo(outputPath)Sonrası (IronBarcode):
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.SaveAsPng(outputPath);Imports IronBarCode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.SaveAsPng(outputPath)Infragistics Symbology numaralandırma değeri, bir özellik atamasından ziyade CreateBarcode() için bir parametre olan BarcodeEncoding numaralandırmasına taşınır. Veriler ilk argüman olur. SaveTo(), çıktı formatınıza bağlı olarak .SaveAsPng(), .SaveAsJpeg(), .SaveAsSvg() veya .SaveAsPdf() olarak değişir.
Barkodu kaydetmeden önce yeniden boyutlandırmanız gerekiyorsa:
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng(outputPath);Imports IronBarCode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng(outputPath)WPF Olay Güdümlü Okuma: Hizmet Sınıfından İki Satıra
Bu geçişteki en önemli azaltma budur.InfragisticsWPF okuma modeli tam bir hizmet sınıfı gerektirir:
Önce (Infragistics WPF — ~35 satır):
using Infragistics.Controls.Barcodes;
using System.Windows.Media.Imaging;
private BarcodeReader _reader;
private TaskCompletionSource<string> _result;
public InfragisticsBarcodeService()
{
_reader = new BarcodeReader();
_reader.DecodeComplete += OnDecodeComplete;
}
public async Task<string> ReadBarcodeAsync(string imagePath)
{
_result = new TaskCompletionSource<string>();
var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));
_reader.SymbologyTypes = Symbology.Code128 |
Symbology.Code39 |
Symbology.QRCode |
Symbology.EAN8 |
Symbology.EAN13 |
Symbology.UpcA |
Symbology.Interleaved2Of5;
_reader.Decode(bitmap);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(e.Value ?? "No barcode found");
}
public void Dispose()
{
if (_reader != null)
{
_reader.DecodeComplete -= OnDecodeComplete;
_reader = null;
}
}Imports Infragistics.Controls.Barcodes
Imports System.Windows.Media.Imaging
Imports System.Threading.Tasks
Private _reader As BarcodeReader
Private _result As TaskCompletionSource(Of String)
Public Sub New()
_reader = New BarcodeReader()
AddHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
End Sub
Public Async Function ReadBarcodeAsync(imagePath As String) As Task(Of String)
_result = New TaskCompletionSource(Of String)()
Dim bitmap As New BitmapImage(New Uri(imagePath, UriKind.Absolute))
_reader.SymbologyTypes = Symbology.Code128 Or
Symbology.Code39 Or
Symbology.QRCode Or
Symbology.EAN8 Or
Symbology.EAN13 Or
Symbology.UpcA Or
Symbology.Interleaved2Of5
_reader.Decode(bitmap)
Return Await _result.Task
End Function
Private Sub OnDecodeComplete(sender As Object, e As ReaderDecodeArgs)
_result?.TrySetResult(If(e.Value, "No barcode found"))
End Sub
Public Sub Dispose()
If _reader IsNot Nothing Then
RemoveHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
_reader = Nothing
End If
End SubSonra (IronBarcode — 2 satır):
using IronBarCode;
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";Imports IronBarCode
Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No barcode found")Tüm servis sınıfı — nesne yönetimi, olay bağlantısı, TaskCompletionSource, BitmapImage yükleme, Dispose() — tamamen kaldırıldı. BarcodeReader.Read() eşzamanlıdır, statiktir ve bir dosya yolu dizgesini doğrudan kabul eder.
Eğer semboloji türünü de döndürüyorsanız:
using IronBarCode;
var results = BarcodeReader.Read(imagePath);
var first = results.FirstOrDefault();
if (first != null)
{
Console.WriteLine($"Value: {first.Value}, Format: {first.Format}");
}Imports IronBarCode
Dim results = BarcodeReader.Read(imagePath)
Dim first = results.FirstOrDefault()
If first IsNot Nothing Then
Console.WriteLine($"Value: {first.Value}, Format: {first.Format}")
End Ifresult.Value, e.Value ile değiştirilir. result.Format, e.Symbology ile değiştirilir.
WinForms Okuma Eklemek (Önceden İmkânsız)
Sadece üretimi olan bir WinForms projesindeyseniz, okuma şimdi aynı paketle kullanılabilir.
using IronBarCode;
// In a WinForms button handler or service method — same API as WPF or ASP.NET Core
var results = BarcodeReader.Read(imagePath);
foreach (var result in results)
{
MessageBox.Show($"Found: {result.Value} ({result.Format})");
}Imports IronBarCode
' In a WinForms button handler or service method — same API as WPF or ASP.NET Core
Dim results = BarcodeReader.Read(imagePath)
For Each result In results
MessageBox.Show($"Found: {result.Value} ({result.Format})")
NextEkstra paket yok, framework-spesifik kurulum yok. Aynı BarcodeReader.Read() çağrısı, WinForms'ta olduğu gibi WPF'de çalışır.
ASP.NET Çekirdek Uç Nokta (Önceden İmkânsız)
Infragistics paketleri ile birASP.NET Coredenetleyicisi içinde barkod üretimi ve okuma mümkün değildi.IronBarcode ile:
using IronBarCode;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/barcode")]
public class BarcodeController : ControllerBase
{
[HttpPost("read")]
public IActionResult ReadBarcode(IFormFile imageFile)
{
using var stream = imageFile.OpenReadStream();
var results = BarcodeReader.Read(stream);
var values = results.Select(r => new { r.Value, Format = r.Format.ToString() });
return Ok(values);
}
[HttpGet("generate")]
public IActionResult GenerateBarcode([FromQuery] string data)
{
var bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
return File(bytes, "image/png");
}
}Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("api/barcode")>
Public Class BarcodeController
Inherits ControllerBase
<HttpPost("read")>
Public Function ReadBarcode(imageFile As IFormFile) As IActionResult
Using stream = imageFile.OpenReadStream()
Dim results = BarcodeReader.Read(stream)
Dim values = results.Select(Function(r) New With {Key .Value = r.Value, Key .Format = r.Format.ToString()})
Return Ok(values)
End Using
End Function
<HttpGet("generate")>
Public Function GenerateBarcode(<FromQuery> data As String) As IActionResult
Dim bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.ToPngBinaryData()
Return File(bytes, "image/png")
End Function
End ClassBarcodeReader.Read() bir Stream doğrudan kabul eder — yükleme işlemini önce diske kaydetmeye gerek yok.
PDF Barkod Okuma
IronBarcode, PDF belgelerinden barkod okur — ayrı bir paket gerektirmez.
using IronBarCode;
// Read all barcodes from every page of a PDF
var results = BarcodeReader.Read("document.pdf");
foreach (var result in results)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})");
}Imports IronBarCode
' Read all barcodes from every page of a PDF
Dim results = BarcodeReader.Read("document.pdf")
For Each result In results
Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})")
NextInfragistics'in bir karşılığı yoktu — PDF barkod okuma, PDF sayfalarını dışarıda taramadan önce görsellere dönüştürmeyi gerektiriyordu.
Toplu İşleme: Sıralıdan Paralel'e
Önce (Infragistics — sıralı, paralelleştirmeye uygun değil):
// Must process one at a time — shared _result field is not thread-safe
var service = new InfragisticsBarcodeService();
var results = new List<string>();
foreach (var file in imageFiles)
{
var value = await service.ReadBarcodeAsync(file);
results.Add(value);
}
service.Dispose();Imports System.Collections.Generic
' Must process one at a time — shared _result field is not thread-safe
Dim service As New InfragisticsBarcodeService()
Dim results As New List(Of String)()
For Each file In imageFiles
Dim value As String = Await service.ReadBarcodeAsync(file)
results.Add(value)
Next
service.Dispose()Sonra (IronBarcode — paralel, iş parçacığı güvenli):
using IronBarCode;
// Option 1: pass an array directly —IronBarcode handles parallelization internally
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read(imageFiles.ToArray(), options);
foreach (var result in results)
{
Console.WriteLine($"{result.Value} ({result.Format})");
}
using IronBarCode;
using System.Collections.Concurrent;
// Option 2: Parallel.ForEach — static BarcodeReader.Read is thread-safe
var allValues = new ConcurrentBag<string>();
Parallel.ForEach(imageFiles, file =>
{
var results = BarcodeReader.Read(file);
foreach (var r in results)
allValues.Add(r.Value);
});Imports IronBarCode
Imports System.Collections.Concurrent
' Option 2: Parallel.ForEach — static BarcodeReader.Read is thread-safe
Dim allValues As New ConcurrentBag(Of String)()
Parallel.ForEach(imageFiles, Sub(file)
Dim results = BarcodeReader.Read(file)
For Each r In results
allValues.Add(r.Value)
Next
End Sub)Dispose Desenini Kaldırma
KodunuzdaInfragisticsBarcodeReader etrafında IDisposable uygulamalarınız varsa, bunlar tamamen kaldırılabilir. IronBarcode'un BarcodeReader statik bir sınıftır. Oluşturulacak bir örnek yok, ayrılacak bir olay işleyici yok ve çağrılacak bir Dispose() yok.
// Before: service registered as IDisposable in DI container
services.AddScoped<InfragisticsBarcodeService>(); // implements IDisposable
// After: no registration needed — use static method directly, or wrap in thin service if preferred
// services.AddScoped<IBarcodeService, IronBarcodeService>();' Before: service registered as IDisposable in DI container
services.AddScoped(Of InfragisticsBarcodeService)() ' implements IDisposable
' After: no registration needed — use static method directly, or wrap in thin service if preferred
' services.AddScoped(Of IBarcodeService, IronBarcodeService)()DI amaçlı ince bir kaplama hizmeti basittir.
using IronBarCode;
public class BarcodeService
{
public IEnumerable<string> Read(string path)
=> BarcodeReader.Read(path).Select(r => r.Value);
public byte[] Generate(string data, BarcodeEncoding encoding)
=> BarcodeWriter.CreateBarcode(data, encoding).ToPngBinaryData();
}Imports IronBarCode
Public Class BarcodeService
Public Function Read(path As String) As IEnumerable(Of String)
Return BarcodeReader.Read(path).Select(Function(r) r.Value)
End Function
Public Function Generate(data As String, encoding As BarcodeEncoding) As Byte()
Return BarcodeWriter.CreateBarcode(data, encoding).ToPngBinaryData()
End Function
End ClassKonstruktor enjeksiyonu yok, Dispose() yok, olay yönetimi yok.
Yaygın Geçiş Sorunları
SymbologyType Bayrakları Kaldırıldı
Infragistics WPF okuyucusundaki SymbologyTypes özelliği, desteklemek istediğiniz her barkod formatını listelemenizi gerektiriyordu. IronBarcode'un bir karşılığı yok — her okumada tüm 50+ formatı otomatik olarak algılar.
Bu önemli bir yan etkiye sahiptir: Eğer belirli bir barkod formatı listede SymbologyType bayrağı eksik olduğu için sessizce başarısız oluyorsa,IronBarcodeşimdi onu bulacaktır. Üretimde sessizce yutulmuş barkod değerleri görebilirsiniz. Bu doğru davranış — bu barkodlar zaten oradaydı.
Hangi formatların döndüğünü sınırlamanız gerekiyorsa (performans veya belirsizlik nedenleriyle), BarcodeReaderOptions bunu destekler:
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = false
};
var results = BarcodeReader.Read(imagePath, options);Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read(imagePath, options)BitmapImage Yüklemeye Gerek Yok
Infragistics WPF okuyucusu, görüntülerin new BitmapImage(new Uri(path, UriKind.Absolute)) aracılığıyla BitmapSource nesneleri olarak yüklenmesini gerektiriyordu. IronBarcode, dosya yolu dizelerini, bayt dizilerini ve akışları doğrudan kabul eder.
// All of these work — no BitmapImage conversion needed
BarcodeReader.Read("path/to/image.png");
BarcodeReader.Read(File.ReadAllBytes("path/to/image.png"));
BarcodeReader.Read(File.OpenRead("path/to/image.png"));' All of these work — no BitmapImage conversion needed
BarcodeReader.Read("path/to/image.png")
BarcodeReader.Read(File.ReadAllBytes("path/to/image.png"))
BarcodeReader.Read(File.OpenRead("path/to/image.png"))Barkodla ilgili görüntü yüklemeleri için yalnızca var olan using System.Windows.Media.Imaging; bildirimlerini kaldırabilirsiniz.
TaskCompletionSource Deseni Kaldırıldı
Olay güdümlü DecodeComplete geri çağırmayı asenkron koda köprüleyen TaskCompletionSource<string> alanı tamamen kaldırıldı. BarcodeReader.Read() eşzamanlıdır ve sonuçlarını doğrudan döndürür.
Çağıran kodunuz await service.ReadBarcodeAsync(path) idiyse, şu şekilde basitleştirebilirsiniz:
// Before
var value = await service.ReadBarcodeAsync(imagePath);
// After
var value = BarcodeReader.Read(imagePath).FirstOrDefault()?.Value ?? "No barcode found";netŞayet çağıranlar için senkronize olmayan bir arayüzü korumak isterseniz, bir iş parçacığını tıkamadan:
public Task<string> ReadBarcodeAsync(string imagePath)
{
return Task.Run(() =>
{
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
});
}Option Strict On
Option Infer On
Public Function ReadBarcodeAsync(imagePath As String) As Task(Of String)
Return Task.Run(Function()
Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No barcode found")
End Function)
End FunctionÖzellik Adı Değişiklikleri
| Infragistics | IronBarcode |
|---|---|
e.Value (içinde ReaderDecodeArgs) | result.Value |
e.Symbology (içinde ReaderDecodeArgs) | result.Format |
barcode.Data | BarcodeWriter.CreateBarcode() ilk parametre |
barcode.Symbology = Symbology.Code128 | BarcodeEncoding.Code128 (parametre) |
barcode.SaveTo(path) | .SaveAsPng(path) / .SaveAsJpeg(path) / .SaveAsSvg(path) |
Geçiş Kontrol Listesi
Kod tabanınızdaki tümInfragisticsbarkod kullanımlarını bulmak için bu grep kalıplarını kullanın:
# Namespace references
grep -r "Infragistics.WinForms.Barcode\|Infragistics.Win.UltraWinBarcode" --include="*.cs" .
grep -r "Infragistics.Controls.Barcodes" --include="*.cs" .
grep -r "Infragistics.WPF.BarcodeReader" --include="*.csproj" .
# WinForms generation types
grep -r "UltraWinBarcode" --include="*.cs" .
grep -r "Symbology\.Code" --include="*.cs" .
grep -r "barcode\.SaveTo(" --include="*.cs" .
# WPF reading types and patterns
grep -r "new BarcodeReader()" --include="*.cs" .
grep -r "DecodeComplete" --include="*.cs" .
grep -r "ReaderDecodeArgs" --include="*.cs" .
grep -r "SymbologyType\." --include="*.cs" .
grep -r "e\.Value\|ReaderDecodeArgs" --include="*.cs" .
grep -r "BitmapImage" --include="*.cs" .
# TaskCompletionSource usage (likely barcode-related if near above patterns)
grep -r "TaskCompletionSource" --include="*.cs" .
Her bir eşleşme üzerinde çalışın:
UltraWinBarcodekullanımları:BarcodeWriter.CreateBarcode()ile değiştirinnew BarcodeReader()+DecodeCompleteblokları:BarcodeReader.Read()ile değiştirinSymbologyTypebayrak listeleri: tamamen silin- Barkod girdisi için kullanılan
BitmapImageyüklemeleri: doğrudan yol/akış/bayt ile değiştirin ReaderDecodeArgs egeri çağırma gövdeleri:e.Valueçıkart →result.Value,e.Symbologyçıkart →result.Format- Barkod servis sınıflarındaki
IDisposable: tek kullanımlık kaynak yalnızca_readerise kaldırın
Özellik Karşılaştırması
| Özellik | Infragistics Barkod | IronBarcode |
|---|---|---|
| WinForms barkod üretimi | Evet (UltraWinBarcode) | Evet |
| WinForms barkod okuma | Mevcut değil | Evet |
| WPF barkod üretimi | Evet (XamBarcode) | Evet |
| WPF barkod okuma | Evet (olay yönelimli) | Evet (senkron) |
| ASP.NET Core | Mevcut değil | Evet |
| Konsol / İşçi Hizmeti | Mevcut değil | Evet |
| Docker / Linux | Mevcut değil | Evet |
| Azure Functions | Mevcut değil | Evet |
| Blazor Sunucusu | Mevcut değil | Evet |
| Otomatik format algılama | Hayır — SymbologyType bayrakları gerekti | Evet |
| PDF barkod okuma | Mevcut değil | Evet (yerel) |
| Eşzamanlı iş parçacığı güvenli okumalar | Hayır | Evet |
| Toplu okuma (yerleşik) | Hayır | Evet |
| QR hata düzeltme kontrolü | Mevcut değil | Evet |
| Statik API (örnek yok) | Hayır | Evet |
| Suite aboneliği gerekti | Evet (Infragistics Ultimate, 2.399+ USD/yıl) | Hayır |
| Süresiz lisans | Hayır | Evet — 749 $ 'dan başlayan |
Geçiş Setelahı Temel Faydalar
WinForms'ta barkod okuma. Eğer geçiş WinForms okuma gereksinimi tarafından yönlendirildiyse, bu birincil sonuçtur: BarcodeReader.Read(imagePath) WinForms'ta derlenir ve çalışır, ek bir kurulum gerekmez.
ASP.NET Core ve konsol desteği. Web API'leri, arka plan hizmetleri ve konsol araçları artık aynı paketle hem barkod üretebilir hem de okuyabilir. Eğer bu proje türleri için ayrı araç zincirleri veya dolaşma yolları bakımı yapıyorsanız, şimdi yoktur.
Olay işleyici şablonu yok. DecodeComplete işleyici, TaskCompletionSource köprüsü, BitmapImage yükleme ve Dispose() temizleme hepsi kaldırıldı. Barkod mantığı kalır.
Semboloji spesifikasyonu yok. Eksik SymbologyType bayrakları nedeniyle sessizce başarısız olan formatlar şimdi doğru algılanacak. Otomatik algılama, yapılandırma olmadan tüm 50+ formatı kapsar.
Tüm proje türlerinde aynı servis sınıfı. WinForms, WPF,ASP.NET Coreve çözümdeki herhangi bir projede kullanılmak üzere tek bir BarcodeService sarmalayıcı, BarcodeReader.Read() ve BarcodeWriter.CreateBarcode() kullanır. Çerçeveye özel uygulamalar yok.
Sadece barkod işlevselliği içinInfragisticsUltimate aboneliğine gerek yok. Eğer proje bilginizde birInfragisticsUltimate aboneliğine sahip olan varsa, veya karar içinde önemli bir faktör ise,IronBarcode bağımsız bir pakettir ve süresiz lisanslama seçenekleri 749 $'dan bir geliştirici için başlamakta.
Geçiş işlemi,Infragisticsbarkod kullanımını tespit ettikten sonra mekanik hale gelir. En karmaşık bölüm, WPF servis sınıfının değiştirilmesidir ve bu bile sınıfı kaldırıp çağrıları BarcodeReader.Read() ile değiştirmeye indirgenir. Üretim geçişi, bir-birine özellik/metod adlandırma. Geri aldığınız tek şey, ihtiyacınız olan her proje türündeki tek ve tutarlı bir API'dir.

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapılandırılmış, görsel olarak çekici kılavuzlar oluşturmayı seviyor.