2011-10-30 82 views
0

我試圖創建另一種類型的數據提供者(ESRIs地理數據庫,使用ESRIs .NET庫)的Active Record實現(我知道Castle的倡議,它非常好),而我達到一些有趣的事情。動態代理:包裝構造函數

我還有一個問題。我有我的ActiveRecord類是這樣的:

public interface IActiveRecord<T> : IActiveRecord where T : class 
{ 
    T Create(); 
    void Update(T record); 
    void Delete(T record); 
} 

public interface IActiveRecord 
{ 
    int ObjectId { get; set; } 
    bool Managed { get; } 
    bool IsValid { get; } 

    IObject EsriObject { get; set; } 

    IGeometry Geometry { get; set; } 

    void Save(); 
    void Delete(); 
} 

我有靜態的創建方法,哪去了DynamicProxy並生成我的代理。但是我怎麼能強制爲代理生成的實例也被代理呢?

public class ActiveRecord<T> : IActiveRecord where T : IActiveRecord,new() 
{ 

    // protected constructors 

    public static T Create(IObject obj) 
    { 
     var record = Create(); 
     record.EsriObject = obj; 
     return (T)record; 
    } 
} 

// inherited class 
[Workspace(@"C:\teste.gdb")] 
[Table("TB_PARCEL",Geometry=esriGeometryType.esriGeometryPolygon)] 
public class Parcel : ActiveRecord<Parcel>,IParcel 
{ 
    [Field(4, "NM_PARCEL_ID", esriFieldType.esriFieldTypeString)] 
    public virtual string ParcelId { get; set; } 

    [Field(5, "NR_PARCEL_NO", esriFieldType.esriFieldTypeInteger)] 
    public virtual int StreetNumber { get; set; } 
    public virtual IOwner ParcelOwner { get; set; } 
} 

看看測試。前三項測試像往常一樣截獲,但不是第四項測試。我需要A)阻止用戶實例化它自己的類(在我看來API的方法不好),或者找到一種方法從繼承的類構造函數返回代理。

[TestMethod] 
    public void ActiveRecordConstructor() 
    { 
     Parcel p1 = Parcel.Create(); 
     Assert.IsFalse(p1.Managed); 
     Assert.AreEqual(null, p1.ParcelId); 

     Parcel p2 = Parcel.Create(2); 
     Assert.IsFalse(p2.Managed); 

     IObject fake = _repository.StrictMock<IObject>(); 

     using (_repository.Record()) 
     { 
      fake.Stub(x => x.get_Value(4)).Return("teste"); 
     } 

     using (_repository.Playback()) 
     { 
      Parcel p3 = Parcel.Create(fake); 
      Assert.IsTrue(p3.Managed); 
      Assert.AreEqual("teste", p3.ParcelId); 
     } 

     // this wont be intercepted 
     Parcel p4 = new Parcel(); 
     Assert.IsFalse(p4.Managed); 
     Assert.IsNull(p4.ParcelId); 
    } 

總之我需要每當用戶創建一個新的Class()時,它就會返回一個代理對象。允許繼承時可能嗎?

謝謝!

回答

1

DynamicProxy無法攔截對構造函數的調用。它必須控制對象的創建。