簡體   English   中英

我的庫中的延遲加載或代理模式

[英]Lazy loading or proxy pattern in my library

嗨,我正在寫一個簡單的 ORM DLL。 該庫工作正常,我想添加一些插件 - 延遲加載。 但我不知道如何實現。 我有一個提議。

在我的 orm 中(我有創建者,但沒關系)用戶應該創建 DB class 實現 IMapper 並設置映射器 class。 有人認為鏈接這個。

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>();
}

如果我們有 class 並設置 connectionString,我們可以從 DB 中獲取數據。 它與實體框架非常相似

Person p = Persons.Single(x=>x.Name == "John");

在那一刻,我將檢查映射 class 中的所有屬性,如果是虛擬的,則不返回 class,而是延遲加載 class。 我想出了一個概念。 不返回(在該示例中)人員 class 而是擴展人員 class 的 class,並覆蓋所有屬性。

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;}
}

使用該 class 用戶不應該看到任何變化(僅在調試時它可能會看到其他類)它應該像魔術一樣工作:P

我的問題是: 1. 如何在實體框架中實現延遲加載,有人知道嗎? 2.我的提議更簡單嗎? 在我的想法中,我必須將 TypeBuilder 和 Emit 與 IL 源代碼一起使用——我聽說這是它們不以正常方式使用的屬性的問題。

延遲加載是通過在運行時生成繼承器並覆蓋所有方法來實現的。

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)

使用Castle.DynamicProxy (與 nhibernate 使用的代理相同)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM