2011-10-30 7 views
0

다른 유형의 데이터 제공 업체 (ESRI .NET 라이브러리를 사용하는 ESRI 지오 데이터베이스)와 액티브 레코드 구현 (나는 Castle의 이니셔티브에 대해 알고 있으며 매우 좋습니다) 흥미 진진한 뭔가에 도달했습니다.동적 프록시 : 랩핑 생성자

그럼에도 불구하고 질문이 있습니다.

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

I 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는 생성자에 대한 호출을 가로 챌 수 없습니다. 그것은 객체의 생성을 제어해야합니다.