ESRIの.NETライブラリを使用する別のタイプのデータプロバイダ(ESRIのジオデータベース、.NETライブラリ)を使用するアクティブレコードの実装(キャッスルのイニシアティブについて知っています。興味深いものに到達しています。ダイナミックプロキシ:ラッピングコンストラクタ
質問があります。私はこのような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();
}
私は動的プロキシに行き、私にプロキシを生成する静的Createメソッドを持っています。しかし、継承クラス用に生成されたインスタンスもプロキシされることをどのように強制できますか?
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; }
}
テストを見てください。最初の3つのテストは通常通り傍受されますが、4番目のテストは傍受されません。私は)自分自身のクラス(私の意見では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()を作成するたびに、プロキシされたオブジェクトが返される必要があります。継承を許可している間は可能ですか?
ありがとうございます!