Memulai Dengan Unity IoC Container Di .NET Core Menggunakan Entity Framework Core ORM Dan SQL Server

  • Whatsapp
Memulai Dengan Unity IoC Container Di .NET Core Menggunakan Entity Framework Core ORM Dan SQL Server

Halo Rekan Programmer!

Pada artikel ini, saya akan mendemonstrasikan cara menggabungkan Unity IoC Container ke dalam Aplikasi .NET Core Console menggunakan Entity Framework Core ORM dan SQL Server. Ini akan menerapkan metodologi injeksi konstruktor injeksi ketergantungan di mana dalam dependensi disediakan melalui konstruktor . Saya telah menggunakan Kontainer IoC ini beberapa tahun yang lalu dan belum melakukan pengkodean apa pun setelah itu. Jadi inilah saatnya untuk meninjau kembali alat hebat ini dan membuat aplikasi sederhana yang akan mengambil satu catatan dari database sampel Microsoft yang disebut ContosoRitelDw. Pastikan DB diinstal pada mesin Anda. Setelah selesai, sekarang kita dapat melanjutkan membuat contoh program dengan melakukan langkah-langkah di bawah ini.

Pengaturan Proyek

1. Mulailah dengan membuat Aplikasi .NET Core Console yang menargetkan kerangka kerja terbaru yaitu .NET 5.0
2. Tambahkan tiga folder baru Model, Repositori dan UnitOfWork. Folder ini berisi model dan kelas DAL yang digunakan dalam proyek ini.

Bacaan Lainnya

Memulai Dengan Unity IoC Container Di .NET Core Menggunakan Entity Framework Core ORM Dan SQL Server

3. Tambahkan paket NuGet berikut: Microsoft.EntityFrameworkCore,Microsoft.EntityFrameworkCore.SqlServer, Microsoft.EntityFrameworkCore.Tools, System.Configuration.ConfigurationManager dan wadah Unity IoC.

Memulai Dengan Unity IoC Container Di .NET Core Menggunakan Entity Framework Core ORM Dan SQL Server

4. Reverse Engineer ContosoRetailsDW dengan menjalankan Scaffold-DbContext di Package Manager Console. Ganti atribut Server dengan server default Anda.

PM> Scaffold-DbContext "Server=Your_Server;Database=ContosoRetailDW;Integrated Security=True" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

Akses Data, Repositori, dan Unit Kerja

Di bagian ini, kita akan membahas kelas dan antarmuka yang berinteraksi dengan database ContosoRetailsDW. Pola desain yang digunakan pada dasarnya adalah Repositori dan Unit Kerja. Untuk demo ini, saya hanya akan menanyakan satu record dari tabel Employee. Oleh karena itu, hilangkan fungsionalitas CRUD lainnya seperti Buat, Perbarui, dan Hapus.

1. Pertama, kita perlu memiliki repositori dasar yang berisi metode get by id yang mengembalikan tipe generik.

public interface IRepository<T> where T : class{
T GetByID(int Id);
}
2. Selanjutnya adalah membuat repositori generik yang mendefinisikan variabel ContosoRetailDWContext yang bertanggung jawab untuk berkomunikasi dengan database dan kelas ini mewarisi antarmuka IRepository dan mengimplementasikan metode GetByID().

public class GenericRepository<T> : IRepository<T> where T : class{
private ContosoRetailDWContext _context;

public GenericRepository()
{
this._context = new ContosoRetailDWContext();
}

public T GetByID(int Id)
{
return _context.Set<T>().Find(Id);
}
}

3. Tambahkan antarmuka IEmployeeRepository yang mewarisi antarmuka IRepository dengan tipe Employee.

public interface IEmployeeRepository : IRepository<DimEmployee>
{
//you may add other methods here specific to employees.
}

4. Kemudian buat kelas EmployeeRepository yang mewarisi repositori generik dan repositori dasar.

public class EmployeeRepository : GenericRepository<DimEmployee>, IEmployeeRepository
{
public EmployeeRepository()
{ }
}

5. Setelah membuat class dan interface repository kita, maka dilanjutkan dengan pola Unit Of Work. Pertama adalah membuat antarmuka IUnitOfWork dengan properti EmployeeRepository yang bertipe IEmployeeRepository.

public interface IUnitOfWork 
{
IEmployeeRepository EmployeeRepository { get; }
}

6. Selanjutnya adalah menghasilkan kelas yang mewarisi antarmuka IUnitOfWork. Kelas ini mengimplementasikan properti EmployeeRepository dengan pengambil dan pengakses setter pribadi. Konstruktor kelas ini menerima parameter IEmployeeRepository yang kemudian akan diselesaikan oleh wadah Unity IoC.

public class UnitOfWork : IUnitOfWork
{
public IEmployeeRepository EmployeeRepository { get; private set; }

public UnitOfWork(IEmployeeRepository employeeRepository)
{
EmployeeRepository = employeeRepository;
}
}

Mendaftar dan Menyelesaikan Jenis

Kelas UnityContainerResolver di bawah ini akan menyelesaikan dependensi yang menyertakan jenis layanan dan kelasnya. Metode RegisterType() memetakan antarmuka ke kelas tertentu. Ini berarti bahwa wadah Unity IoC akan secara otomatis menyuntikkan objek tertentu dari suatu tipe ke antarmuka. Contohnya adalah antarmuka IUnitOfWork kemudian akan dipetakan ke kelas UnitOfWork melalui injeksi konstruktor. Metode Resolve() memilah jenis dan mengeksekusi injeksi konstruktor.

public class UnityContainerResolver
{
private UnityContainer container;

public UnityContainerResolver()
{
container = new UnityContainer();
RegisterTypes();
}

public void RegisterTypes()
{
container.RegisterType(typeof(IRepository<>), typeof(GenericRepository<>));
container.RegisterType<IEmployeeRepository, EmployeeRepository>();
container.RegisterType<IUnitOfWork, UnitOfWork.UnitOfWork>();
}

public UnitOfWork.UnitOfWork Resolver()
{
return container.Resolve<UnitOfWork.UnitOfWork>();
}
}

Menjalankan Aplikasi

Di kelas Program.cs kita, kita perlu membuat dua objek statis khususnya UnitOfWork dan UnityContainerResolver. Objek UnityContainerResolver perlu dibuat instance-nya terlebih dahulu dalam metode Main() sebelum menggunakannya. Selanjutnya adalah membuat metode ShowEmployee() yang akan mengambil record dari database. Pernyataan kode pertama dari metode ini akan memanggil metode UnityContainerResolver Resolver() dan melemparkannya ke objek UnitOfWork. Objek UnitOfWork kemudian akan mengeksekusi metode GetByID() dari kelas repositori karyawan dengan meneruskan id karyawan yang ada ke parameter fungsi dan menyimpan hasilnya dalam objek karyawan.

class Program
{
private static IUnitOfWork _unitOfWork;
private static UnityContainerResolver _resolver;

static void Main(string[] args)
{
_resolver = new UnityContainerResolver();

Console.WriteLine($"n-----------------------------Employee Record-----------------------------");
ShowEmployee();
Console.ReadLine();
}

static void ShowEmployee()
{
_unitOfWork = (IUnitOfWork)_resolver.Resolver();

var emp = _unitOfWork.EmployeeRepository.GetByID(1);
Console.WriteLine($"Employee Name: { emp.FirstName} " + $"{ emp.LastName}, Employee Email: {emp.EmailAddress} ");
}
}

Contoh output ditunjukkan di bawah ini.

Keluaran
Memulai Dengan Unity IoC Container Di .NET Core Menggunakan Entity Framework Core ORM Dan SQL Server

Pos terkait

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *