Динамический Прокси: оберточные конструкторы - PullRequest
0 голосов
/ 30 октября 2011

Я пытаюсь создать реализацию Active Record (я знаю об инициативе Касла, и это очень хорошо) для другого типа провайдера данных (базы геоданных ESRI, использующие библиотеки ESRIs .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, которые переходят к 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; }
}

Посмотрите на тесты. Первые три теста перехватываются как обычно, но не четвертый тест. Мне нужно А) не дать пользователю создавать свои собственные классы (на мой взгляд, плохой подход к 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 Ответ

1 голос
/ 06 ноября 2011

DynamicProxy не может перехватывать вызовы конструкторов. Он должен контролировать создание объекта.

...