Làm thế nào tôi nên đóng gói truy cập cơ sở dữ liệu?


10

Một số ví dụ về cấu trúc lớp tốt được sử dụng để quản lý truy cập cơ sở dữ liệu là gì? Tôi là một fan hâm mộ của đóng gói lớp và muốn các container (ví dụ như xe hơi) không thực hiện các nhiệm vụ cơ sở dữ liệu.

Tôi cũng muốn khả năng dễ dàng thả những thứ như bộ đệm cơ sở dữ liệu trong tương lai.

Tôi thường lấy mẫu của các lớp container, hoàn thành với getters và setters để xác thực và truy cập cơ sở dữ liệu được thực hiện bởi một lớp singleton duy nhất. Điều đó đang được nói, điều này thường được trộn lẫn giữa hai và trở nên khá khó hiểu.

Xin lỗi nếu câu hỏi của tôi khó hiểu; Tôi không hoàn toàn chắc chắn về các điều khoản liên quan đến cơ sở dữ liệu. Xin vui lòng yêu cầu làm rõ nếu cần.


Bạn có cân nhắc sử dụng ORM để liên kết các lớp với cơ sở dữ liệu, chẳng hạn như Wt :: Dbo không?
dùng52875

Câu trả lời:


11

Tôi thích Mẫu lưu trữ để đóng gói truy cập dữ liệu. Tóm lại, kho lưu trữ có trách nhiệm tải tất cả dữ liệu cần thiết cho một đối tượng cụ thể. Giả sử bạn có một đối tượng Xe, như trong ví dụ của bạn. Nhưng tất cả các thuộc tính cho xe hơi, nhãn hiệu, kiểu máy, năm, chủ sở hữu, tính năng (đầu CD, 4wd, v.v.) được lưu trữ trong các bảng khác nhau trong toàn bộ cơ sở dữ liệu. Kho lưu trữ xác định cách tải và lưu dữ liệu. Nếu cần nhiều truy vấn nhỏ hơn, tốt thôi, nhưng chỉ mẫu lưu trữ cần biết điều đó. Tầng dịch vụ gọi kho lưu trữ chỉ cần biết kho lưu trữ nào sẽ gọi.

Điều đó sau đó có thể được kết hợp với các đơn vị của mô hình công việc . Vì vậy, trong ví dụ của bạn, lớp dịch vụ sẽ nói rằng nó cần tải một thực thể xe hơi, nó có một số loại định danh duy nhất và gửi định danh đó xuống kho lưu trữ. Các kho lưu trữ trả về thực thể xe hơi. Một số mã khác thao túng thực thể xe hơi và gửi thực thể đó trở lại kho lưu trữ để nó có thể được lưu.

Nếu bạn thực sự muốn đi hết, lớp kho lưu trữ sẽ chỉ hiển thị các giao diện, chẳng hạn như ICarRep repository. Kho lưu trữ sẽ chứa một nhà máy mà lớp dịch vụ sẽ sử dụng để có giao diện ICarRep repository. Tất cả các truy cập cơ sở dữ liệu sẽ được ẩn đằng sau một giao diện, giúp cho việc kiểm tra đơn vị dễ dàng hơn nhiều.


Tất cả đều tuyệt vời ngoại trừ bit cuối cùng về các giao diện trong c ++ không tồn tại (trừ khi OP không có ý gắn thẻ c ++). Tôi rất tò mò muốn xem triển khai Mô hình Kho lưu trữ trong C ++ vì tôi muốn sử dụng nó với QT. Tôi ngạc nhiên không có gì có thể sử dụng trực tuyến = [
johnildergleidisson

6

Tôi đã sử dụng Mẫu chiến lược để đóng gói truy cập dữ liệu. Mẫu này cho phép bạn ẩn loại lưu trữ bạn đang sử dụng đằng sau một giao diện chung. Trong giao diện, xác định phương thức truy cập dữ liệu của bạn mà không cần quan tâm đến loại lưu trữ (tệp, cơ sở dữ liệu, web). Sau đó, đối với lựa chọn lưu trữ hiện tại của bạn, trong một lớp thực hiện giao diện chiến lược, hãy triển khai các chi tiết truy cập dữ liệu. Bằng cách này, ứng dụng của bạn không quan tâm đến nguồn dữ liệu bạn đang sử dụng.

Bạn cũng có thể xây dựng một lớp dịch vụ sử dụng thể hiện chiến lược lưu trữ dữ liệu hiện tại để xác định chi tiết cụ thể hơn cho ứng dụng thay vì trộn lẫn quyền truy cập dữ liệu và logic nghiệp vụ với nhau.


Vì vậy, bạn sẽ thêm một lớp truy cập cho từng loại hoặc một lớp lớn cho tất cả?
Will03uk

cá nhân tôi cũng sẽ xem xét việc áp dụng các bản đúc rõ ràng cho mọi dữ liệu xuất phát từ máy chủ / ứng dụng của tôi.
dùng827992

+1 Tôi thích giao diện của mẫu này, nhưng tôi cảm thấy (trên quy mô dự án của tôi), việc quản lý từng thuật toán riêng biệt cho cơ sở dữ liệu sẽ khó khăn; mặc dù tôi chắc chắn sẽ sử dụng điều này trong các ứng dụng khác. Lambdas phải bổ sung tốt điều này.
Will03uk

1

Đây là một ví dụ về mô hình cơ sở dữ liệu Factory;

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);
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.