Bagaimana saya merangkum akses basis data?


10

Apa saja contoh struktur kelas yang baik yang digunakan untuk mengelola akses basis data? Saya penggemar enkapsulasi kelas dan lebih suka wadah (mis. Mobil) untuk tidak melakukan tugas basis data.

Saya juga ingin kemampuan untuk dengan mudah memasukkan hal-hal seperti cache basis data di masa depan.

Saya sering mengambil pola kelas kontainer, lengkap dengan getter dan setter untuk validasi dan akses basis data yang dilakukan oleh satu kelas tunggal. Yang sedang berkata, ini sering dicampur antara keduanya dan menjadi sangat membingungkan.

Maaf jika pertanyaan saya sulit dimengerti; Saya tidak sepenuhnya yakin tentang ketentuan mengenai database. Silakan meminta klarifikasi jika diperlukan.


Apakah Anda mempertimbangkan menggunakan ORM untuk menautkan kelas ke database, seperti Wt :: Dbo ?
user52875

Jawaban:


11

Saya lebih suka Pola Repositori untuk merangkum akses data. Singkatnya, repositori bertanggung jawab untuk memuat semua data yang diperlukan untuk objek tertentu. Katakanlah Anda memiliki objek Mobil, seperti dalam contoh Anda. Tetapi semua atribut untuk mobil, membuat, model, tahun, pemilik, fitur (CD player, 4wd dll) disimpan dalam berbagai tabel di seluruh database. Repositori menentukan cara memuat dan menyimpan data. Jika beberapa kueri yang lebih kecil diperlukan, bagus, tetapi hanya pola repositori yang perlu mengetahuinya. Lapisan layanan yang menjalankan repositori hanya perlu tahu repositori mana yang akan dipanggil.

Itu kemudian dapat dikombinasikan dengan pola satuan kerja . Jadi pada contoh Anda, lapisan layanan akan mengatakan ia perlu memuat entitas mobil, ia memiliki semacam pengidentifikasi unik, dan mengirimkan pengenal itu ke repositori. Repositori mengembalikan entitas mobil. Beberapa kode lain memanipulasi entitas mobil dan mengirim entitas itu kembali ke repositori sehingga dapat disimpan.

Jika Anda benar-benar ingin keluar semua, lapisan repositori hanya akan mengekspos antarmuka, seperti ICarRepository. Repositori akan berisi pabrik yang akan digunakan oleh lapisan layanan untuk mendapatkan antarmuka ICarRepository. Semua akses basis data akan disembunyikan di balik antarmuka, yang membuat pengujian unit jauh lebih mudah.


Semua bagus kecuali bagian terakhir tentang antarmuka yang di c ++ tidak ada (kecuali OP tidak bermaksud untuk menandai c ++). Saya sangat ingin melihat implementasi Pola Repositori di C ++ karena saya ingin menggunakannya dengan QT. Saya kagum tidak ada yang bisa digunakan online = [
johnildergleidisson

6

Saya telah menggunakan Pola Strategi untuk merangkum akses data. Pola ini memungkinkan Anda untuk menyembunyikan jenis penyimpanan yang Anda gunakan di belakang antarmuka umum. Di antarmuka, tentukan metode akses data Anda dengan mengabaikan jenis penyimpanan (file, database, web). Kemudian untuk pilihan penyimpanan Anda saat ini, di kelas yang menyadari antarmuka strategi, terapkan detail akses data. Dengan cara ini aplikasi Anda tidak peduli dengan sumber data yang Anda gunakan.

Anda juga dapat membangun lapisan layanan yang menggunakan contoh strategi penyimpanan data saat ini untuk mendefinisikan lebih detail spesifik aplikasi daripada mencampur akses data dan logika bisnis secara bersamaan.


Jadi, apakah Anda menambahkan kelas akses untuk setiap jenis atau satu kelas besar untuk semua?
Will03uk

secara pribadi saya juga akan mempertimbangkan penerapan coran eksplisit untuk setiap data yang masuk dari alam ke server / aplikasi saya.
user827992

+1 Saya suka tampilan pola ini, tetapi saya merasa (pada skala proyek saya), mengelola setiap algoritma secara terpisah untuk basis data akan sulit; walaupun saya pasti akan menggunakan ini di aplikasi lain. Lambdas harus melengkapi ini dengan baik.
Will03uk

1

Ini adalah contoh dari pola Pabrik basis data;

using System.Reflection;
using System.Configuration;

public sealed class DatabaseFactory
{
    public static DatabaseFactorySectionHandler sectionHandler = (DatabaseFactorySectionHandler)ConfigurationManager.GetSection("DatabaseFactoryConfiguration");

    private DatabaseFactory() { }

    public static Database CreateDatabase()
    {
        // Verify a DatabaseFactoryConfiguration line exists in the web.config.
        if (sectionHandler.Name.Length == 0)
        {
            throw new Exception("Database name not defined in DatabaseFactoryConfiguration section of web.config.");
        }

        try
        {
            // Find the class
            Type database = Type.GetType(sectionHandler.Name);

            // Get it's constructor
            ConstructorInfo constructor = database.GetConstructor(new Type[] { });

            // Invoke it's constructor, which returns an instance.
            Database createdObject = (Database)constructor.Invoke(null);

            // Initialize the connection string property for the database.
            createdObject.connectionString = sectionHandler.ConnectionString;

            // Pass back the instance as a Database
            return createdObject;
        }
        catch (Exception excep)
        {
            throw new Exception("Error instantiating database " + sectionHandler.Name + ". " + excep.Message);
        }
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.