我的库中的延迟加载或代理模式

| 嗨,我正在编写一个简单的ORM DLL。该库工作正常,我想添加一些addone-延迟加载。 但是我不知道该怎么实现。我有一个主张。 在我的系统中(我有创建者,但没关系),用户应该创建实现IMapper的DB类并设置mapper类。 有人把这个联系起来。
public class Person
{
  public virtual string Name {get;set;}
  public virtual int Age {get; set;}
}

public class DataBase : IMapper
{
  MapperSet<Person> Persons = new MapperSet<Person>();
}
如果我们拥有该类并设置connectionString,则可以从DB中获取数据。与实体框架非常相似
Person p = Persons.Single(x=>x.Name == \"John\");
在那一刻,我将检查映射类中的所有属性,如果是虚拟的,则不返回该类,而是延迟加载类。 我想出一个构想。 (在该示例中)不返回Person类,而是返回扩展Person类并覆盖所有属性的类。
public class PersonReturn : Person
{
  //here i must create a method who really take the data from db
  private string Query = \"SELECT TOP(1) FROM Person WHERE Name = \'John\'\";
  private Execute()
  {
    p = (Person)Db.TableToObject(Query);
  }
  Person p;

  public override string Name 
  {
   get
   {
     if(p == null)
      p = Execute();

    return p.Name;
   }
   set {}
   }

  //same
  public override int Age {get; set;}
}
用户使用该类不应看到任何更改(仅在调试时才可能看到其他类),它应该像魔术一样工作:P 我的问题是: 1.如何在实体框架中实现延迟加载,谁知道? 2.从我的主张出发,更简单的方法吗?在我的想法中,我必须使用带有IL源代码的TypeBuilder和Emit-我听到它的属性问题 他们不是通常使用的方式。     
已邀请:
        使用Castle.DynamicProxy(nhibernate使用的同一代理)     
        延迟加载是通过在运行时生成继承程序并覆盖所有方法来实现的。
public class A
{
    virtual protected string name { get; set; }
}

public interface IInterceptor
{
    object Invoke(MethodInfo method, params object[] arguments);
}

public sealed class AProxy : A
{
    static private readonly MethodInfo getname = typeof(A).GetProperty(\"name\", ...).GetGetMethod(true);
    static private readonly MethodInfo setname = typeof(A).GetProperty(\"name\", ...).GetSetMethod(true);

    private readonly IInterceptor interceptor;

    public AProxy(IInterceptor interceptor)
    {
        this.interceptor = interceptor;
    }

    override protected string name
    {
        get { return this.interceptor.Invoke(AProxy.getname); }
        set { this.interceptor.Invoke(AProxy.setname, value); }
    }
}
代理工厂必须
return new AProxy(custominterceptor);
custominterceptor必须获取您实体的ID,并在首次使用时实例化A,查询数据库以填充A并将委托委派给A。 必须生成AProxy(后构建或使用TypeBuilder的运行时)     

要回复问题请先登录注册