我认为在接受采访时提出这个问题有点荒谬。但如果面试官问......需要回答。
深入解释 :
此致
答案 0 :(得分:7)
您将不得不查看NHibernate源代码以获取更多详细信息,但我的理解如下:通过使用在运行时生成的代理替换类来实现延迟加载。代理继承自类,因此它可以“拦截”方法调用并懒惰地加载实际数据。这种拦截只有在方法和属性是虚拟的情况下才有效,因为客户端代码通过对类的引用来调用它们。客户端代码可能不知道它really使用代理(从类派生)的事实。实际的延迟加载逻辑要复杂得多,但这大致正是如此:
public class Customer {
public virtual String Name {
get { return _name; }
}
}
// code like this gets generated at runtime:
public class CustomerProxy7461293476123947123 : Customer {
private Customer _target;
public override String Name {
get {
if(_target == null){
_target = LoadFromDatabase();
}
return _target.Name;
}
}
}
这样,当客户端实际调用“名称”时,数据才会被加载:
Customer customer = Session.Load<Customer>(1); // <-- proxy is returned
// or
Customer customer = salesman.FavoriteCustomer; // <-- proxy is returned
...
String name = customer.Name; // <-- proxy's Name will be called, loading data
类似的机制用于集合,除了不需要在运行时生成集合。 NHibernate有内置的持久性集合,可以懒散地加载项目。