CSLA.NET переопределяет LoadProperty

Мы хотели бы замаскировать некоторую информацию в наших бизнес-объектах на основе ролей, учитывая, что наша кодовая база используется совместно несколькими проектами, и мы хотели бы сделать это в бизнес-логике, а не в пользовательском интерфейсе.

Наша идея состояла в том, чтобы override использовать метод LoadProperty в CSLA, чтобы мы могли изменить значение один раз вместо того, чтобы устанавливать его в немаскированное значение, а затем маскировать после DataPortal_Fetch. Проблема в том, что виртуальный метод LoadProperty никогда не запускается, см. код ниже:

    protected override void LoadProperty(IPropertyInfo propertyInfo, object newValue)
    {
        //Do masking
        newValue = DoMask(newValue, maskAttribute);
        base.LoadProperty(propertyInfo, newValue);
    }

Ниже приведены два метода в BusinessBase, но только один из них — virtual:

protected void LoadProperty<P>(PropertyInfo<P> propertyInfo, P newValue);
protected virtual void LoadProperty(IPropertyInfo propertyInfo, object newValue);

person Chrisjan Lodewyks    schedule 25.04.2018    source источник


Ответы (1)


Проблема в том, что виртуальный метод LoadProperty никогда не запускается.

Я предполагаю, что ваши вызовы LoadProperty зависят от типа (ваш newValue передается как фактический тип, а не тип object).

Виртуальный неуниверсальный LoadProperty меньше зависит от типа, чем универсальный LoadProperty, поскольку типы параметров — IPropertyInfo и object. Этот метод существует в случаях, когда тип данных значения не может быть определен до времени выполнения.

Поэтому, если вы не передаете newValue как тип object, вместо этого будет вызываться LoadProperty<P>(PropertyInfo<P> propertyInfo, P newValue).

но только один виртуальный

Поскольку метод, который вы на самом деле хотите переопределить, не является виртуальным, вам придется обойти это.

Я бы создал свой собственный метод с другим именем, который выполняет маскировку, а затем вызвал бы базовый метод LoadProperty. Но если вы действительно хотите «переопределить» LoadProperty, вы можете использовать new, чтобы скрыть базовый метод в качестве альтернативы:

protected new void LoadProperty<P>(PropertyInfo<P> propertyInfo, P newValue)
{
    //Do masking
    newValue = DoMask(newValue, maskAttribute);
    base.LoadProperty(propertyInfo, newValue);
}

Обратитесь к этому ответу, чтобы увидеть последствия скрытия вместо переопределения, которые могут быть или не быть проблемой для вас.

person singularhum    schedule 26.04.2018