作爲一個採訪者,我會有三樣東西在尋找答案。
- 知識的ORM框架如何處理延遲加載
- 確認,你不會不考慮現有的框架生產實現這一點。
- 「本土」解決方案的實際設計。
這就是我將如何回答這個問題。
延遲加載由NHibernate或實體框架等ORM框架實現的常見功能。我的第一次嘗試將使用這些框架之一(點1)
如果一個ORM框架沒有問題,我將使用攔截框架(如攔截攔截或攔截)來實施延遲加載(點2)。
爲了實現從零開始的延遲加載,我將使用Decorator模式(獎勵點),Order類的子類並在那裏定義延遲加載行爲。這裏是設計顯示相關屬性:
class Order {
public int ID {get;set;}
public virtual IList<OrderLine> Lines{get;set;}
}
interface IOrderRepository {
Order GetOrder(id);
IList<OrderLine> GetOrderLines(Order order);
}
class OrderService {
IOrderRepository _repository;
public OrderService(IOrderRepository repository) {
_repository = repository;
}
public Order GetOrder(int id) {
return new OrderDecorator(_repository.GetOrder(id));
}
}
public class OrderDecorator : Order {
public OrderDecorator (IOrderRepository repository) {
_OrderLines = new Lazy<IList<OrderLine>>(()=>repository.GetOrderLines(this));
}
Lazy<IList<OrderLine>> _OrderLines;
public override IList<OrderLine> Lines {
get {
if (base.OrderLines == null)
base.OrderLines = _OrderLines.Value;
return base.OrderLines;
}
set {base.OrderLines=value;}
}
}
而這裏是版本沒有Lazy<>
fanciness。編輯完成以確保代碼嚴格符合裝飾器模式後,懶惰版本實際上並沒有添加任何內容,所以我只想使用下面的版本。
public class OrderDecorator : Order {
public OrderDecorator (IOrderRepository repository) {
_Repo = repository;
}
IOrderRepository _Repo;
public override IList<OrderLine> Lines {
get {
if (base.OrderLines == null)
base.OrderLines = repository.GetOrderLines(this);
return base.OrderLines;
}
set {base.OrderLines=value;}
}
}
UPDATE下面是該項目的佈局。有關於耦合訂單和存儲庫的評論。實際情況並非如此,因爲存儲庫與裝飾器耦合,而不是順序。
- 對象集合項目
- 服務層
- 庫層
- OrderRepository
- OrderDecorator
點之一,兩個都是非常有效和有益的。代碼示例(據我所知)仍然與Order Object和IOrderRepo/Service緊密相關。感謝您的幫助和意見。 – Jon 2011-01-27 11:30:18