2012-04-25 27 views
6

Tôi cần có cả các phiên bản trọng lượng nhẹ và trọng lượng nặng của một đối tượng trong ứng dụng của mình.Có mẫu thiết kế cho các phiên bản nhẹ và nặng của vật thể không?

  • Đối tượng trọng lượng nhẹ chỉ chứa các trường ID, nhưng không có trường hợp các lớp liên quan.
  • Một đối tượng có trọng lượng nặng sẽ chứa ID và các phiên bản của các lớp đó.

Dưới đây là một lớp dụ (đối với mục đích của cuộc thảo luận chỉ):

public class OrderItem 
{ 
    // FK to Order table 
    public int OrderID; 
    public Order Order; 

    // FK to Prodcut table 
    public int ProductID; 
    public Product Product; 

    // columns in OrderItem table 
    public int Quantity; 
    public decimal UnitCost; 

    // Loads an instance of the object without linking to objects it relates to. 
    // Order, Product will be NULL. 
    public static OrderItem LoadOrderItemLite() 
    { 
     var reader = // get from DB Query 
     var item = new OrderItem(); 
     item.OrderID = reader.GetInt("OrderID"); 
     item.ProductID = reader.GetInt("ProductID"); 
     item.Quantity = reader.GetInt("Quantity"); 
     item.UnitCost = reader.GetDecimal("UnitCost"); 
     return item; 
    } 

    // Loads an instance of the objecting and links to all other objects. 
    // Order, Product objects will exist. 
    public static OrderItem LoadOrderItemFULL() 
    { 
     var item = LoadOrderItemLite(); 
     item.Order = Order.LoadFULL(item.OrderID); 
     item.Product = Product.LoadFULL(item.ProductID); 
     return item; 
    } 
} 

Có một mẫu thiết kế tốt để làm theo để thực hiện điều này?

Tôi có thể xem cách nó có thể được mã hóa thành một lớp đơn (như ví dụ của tôi ở trên), nhưng không rõ ràng trong trường hợp một cá thể đang được sử dụng. Tôi sẽ cần phải có kiểm tra NULL trong suốt mã của tôi.

Chỉnh sửa: Mô hình đối tượng này đang được sử dụng ở phía ứng dụng khách-máy chủ. Trong trường hợp tôi đang sử dụng các vật nặng, tôi không muốn tải xuống vì nó sẽ lãng phí thời gian và bộ nhớ (tôi sẽ có các đối tượng trong bộ nhớ ở phía máy khách ở nơi khác)

Trả lời

2

bạn đã xem xét sử dụng một công cụ ORM như NHibernate để truy cập DB? Nếu bạn sử dụng một cái gì đó như NHibernate, bạn sẽ nhận được hành vi này bằng cách tải lười biếng. Hầu hết các công cụ ORM thực hiện chính xác những gì bạn đang tìm kiếm trong tải chậm - trước tiên họ nhận được mã định danh đối tượng và khi truy cập một phương thức, họ phát hành các truy vấn tiếp theo để tải các đối tượng liên quan.

3

Khởi tạo lười biếng, Proxy ảo và Ghost là ba triển khai của mẫu tải chậm đó. Về cơ bản họ đề cập đến các thuộc tính tải một khi bạn cần chúng. Bây giờ, tôi giả sử bạn sẽ sử dụng một số repo để lưu trữ các đối tượng, vì vậy tôi sẽ khuyến khích bạn sử dụng bất kỳ công cụ ORM nào có sẵn. (Hibernate, Entity Framework và vv), tất cả đều thực hiện các chức năng này miễn phí cho bạn.

+0

Tôi không luôn muốn tải đối tượng đầy đủ. Và đôi khi, tôi đã có một ví dụ của nó, vì vậy tôi không cần phải tải lại từ DB anyways. – TheSean

+1

@TheSean Nó không quan trọng. Đó chính là tiện ích của mẫu. Nếu bạn cần phải sử dụng chúng, sau đó bạn tải chúng, nếu không thì không. Bây giờ, nếu bạn đang nói về việc không để lộ các thuộc tính phiên bản nặng là thứ khác, nhưng cũng có thể được giải quyết bằng cách sử dụng (tức là hai giao diện: một giao diện nhẹ hơn và nặng hơn). –

+0

Ví dụ: giả sử tôi có 1.000 đơn đặt hàng, mỗi đơn hàng cho cùng một sản phẩm. Với đề xuất của bạn để tải lười biếng đối tượng Product, tôi sẽ tải 1.000 trường hợp của cùng một đối tượng. Đây là những gì tôi có nghĩa là do lãng phí bộ nhớ. – TheSean

0

Có vẻ như bạn có thể cần một đối tượng chuyển dữ liệu (DTO), chỉ cần một lớp trình bao bọc "câm" tóm tắt một thực thể nghiệp vụ. Tôi thường sử dụng một cái gì đó như thế khi tôi cần phải làm phẳng một đối tượng để hiển thị. Hãy cẩn thận, mặc dù: lạm dụng kết quả trong một mô hình chống.

Nhưng hiển thị đối tượng để hiển thị khác với giới hạn số lần truy cập so với cơ sở dữ liệu. Như Randolph chỉ ra, nếu ý định của bạn là sau này, sau đó sử dụng một trong các mẫu tải trả chậm hiện có hoặc tốt hơn, hãy sử dụng ORM.

0

Hãy xem mẫu registry, bạn có thể sử dụng nó để tìm đối tượng và cũng để quản lý tốt hơn các đối tượng này, như giữ chúng trong bộ nhớ cache.

Các vấn đề liên quan