Orm 动态代理:包装构造函数

Orm 动态代理:包装构造函数,orm,castle-dynamicproxy,esri,arcobjects,Orm,Castle Dynamicproxy,Esri,Arcobjects,我正在尝试为另一种类型的数据提供者(ESRIs Geodatabase,使用ESRIs.NET库)创建一个活动记录实现(我知道Castle的计划,这非常好),我正在实现一些有趣的东西 不过,我有一个问题。我有如下的ActiveRecord类: public interface IActiveRecord<T> : IActiveRecord where T : class { T Create(); void Update(T record); void De

我正在尝试为另一种类型的数据提供者(ESRIs Geodatabase,使用ESRIs.NET库)创建一个活动记录实现(我知道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();
}
公共接口IActiveRecord:IActiveRecord,其中T:class
{
T Create();
无效更新(T记录);
作废删除(T记录);
}
公共接口IActiveRecord
{
int ObjectId{get;set;}
布尔管理的{get;}
bool是有效的{get;}
IObject EsriObject{get;set;}
几何图形{get;set;}
作废保存();
作废删除();
}
我有静态的Create方法,这些方法转到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; }
}
public类ActiveRecord:IActiveRecord其中T:IActiveRecord,new()
{
//受保护构造函数
公共静态T创建(IOObject对象)
{
var record=Create();
record.EsriObject=obj;
返回(T)记录;
}
}
//继承类
[工作区(@“C:\teste.gdb”)]
[表格(“TB_地块”,几何图形=esriGeometryType.esriGeometryPolygon)]
公共类包裹:ActiveRecord,IParcel
{
[字段(4,“NM\U地块ID”,ESRIFELDTYPE.ESRIFELDTYPESTRING)]
公共虚拟字符串ParcelId{get;set;}
[字段(5,“编号”,ESRIFELDTYPE.ESRIFELDTYPEINTEGER)]
公共虚拟int街道编号{get;set;}
公共虚拟IOOwner 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);
    }
[TestMethod]
public void ActiveRecordConstructor()
{
地块p1=地块。创建();
Assert.IsFalse(p1.Managed);
Assert.AreEqual(null,p1.ParcelId);
地块p2=地块创建(2);
Assert.IsFalse(p2.Managed);
IObject false=_repository.StrictMock();
使用(_repository.Record())
{
伪.Stub(x=>x.get_值(4)).Return(“teste”);
}
使用(_repository.Playback())
{
地块p3=地块创建(假);
Assert.IsTrue(p3.Managed);
Assert.AreEqual(“teste”,p3.ParcelId);
}
//这不会被拦截
地块p4=新地块();
Assert.IsFalse(p4.Managed);
Assert.IsNull(p4.ParcelId);
}
简而言之,每当用户创建一个新类(),它都会返回一个代理对象。允许继承时,这可能吗


谢谢

DynamicProxy无法拦截对构造函数的调用。它必须控制对象的创建