[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;
}
}
Результат: