[ELMA3] Точка расширения для вывода вычисляемых свойств

Пространство имен: EleWise.ELMA.Web.Mvc.ExtensionPoints

Иногда возникают ситуации, когда при построении таблиц необходимо всегда запрашивать из БД определенные свойства сущности.

Пример: сущность расширяется свойством, вычисляемым на основании другого (далее – родительского) свойства. Если в веб-части в таблице необходимо выводить только вычисляемое свойство без родительского, следует написать реализацию точки расширения IDefaultSelectedColumnsProvider.

[ExtensionPoint(ServiceScope.Shell)]
    public interface IDefaultSelectedColumnsProvider
    {
        /// <summary>
        /// Тип сущности, для которой поддерживает работу данная точка расширения
        /// </summary>
        Type EntityType { get; }

        /// <summary>
        /// Коллекция свойств, которые выбираются всегда при загрузке сущности из БД
        /// </summary>
        /// <returns></returns>
        List<KeyValuePair<PropertyMetadata, EntityMetadata>> GetProperties();
    }

Пример использования (на базе сущности Контрагент)

Сущность Контрагент расширена 2 свойствами: AccountIDInBilling и CalcAccountIDInBilling, которое вычисляется по сценарию на основании AccountIDInBilling.

В разделе Контрагенты в таблице добавлена колонка CalcAccountIDInBilling, однако, значения в таблицу не выводятся, т.к. отсутствует родительское свойство AccountIDInBilling.

Чтобы значения свойства выводились, следует добавить для сущности IContractor реализацию точки расширения IDefaultSelectedColumnsProvider, в которой добавить необходимое свойство AccountIDInBilling.

[Component]
    public class UserContractorDefaultSelectedColumnsProvider : IDefaultSelectedColumnsProvider
    {
        public Type EntityType
        {
            // Указываем тип расширенной сущности
            get { return typeof(IContractor); }
        }

        public List<KeyValuePair<PropertyMetadata, EntityMetadata>> GetProperties()
        {
            var res = new List<KeyValuePair<PropertyMetadata, EntityMetadata>>();
            // Указываем тип расширенной сущности
            var metadata = (EntityMetadata)InterfaceActivator.LoadMetadata<IContractor>();

            // Добавляем свойства, которые должны всегда подгружаться - родительские свойства для вычисляемых
            var property1 = metadata.Properties.FirstOrDefault(p => p.Name == "AccountIDInBilling");
            if (property1 != null)
                res.Add(new KeyValuePair<PropertyMetadata, EntityMetadata>(property1, metadata));

            return res;
        }
    }

Результат: