ILifecycleRoleResolver<TStatedEntity> — интерфейс обработчика, который позволяет динамически вычислять состав роли жизненного цикла для сущности.
Результат работы обработчика используется в следующих сценариях:
Интерфейс применяется для сущностей, которые поддерживают жизненный цикл, то есть реализуют IStatedEntity.
public interface ILifecycleRoleResolver<in TStatedEntity>
where TStatedEntity : class, IStatedEntity
{
Task<List<Guid>> ResolveRole(LifecycleRoleContext context, TStatedEntity entity);
}
Обработчик позволяет определить состав роли программно, а не статически. Состав роли вычисляется на основе:
Типичные сценарии использования:
Task<List<Guid>> ResolveRole(LifecycleRoleContext context, TStatedEntity entity);
Вычисляет и возвращает список идентификаторов пользователей, входящих в роль.
context — контекст выполнения обработчика (LifecycleRoleContext). Наследует DynamicCodeContext и предоставляет доступ к:
entity — сущность, для которой вычисляется роль.
Метод должен вернуть список Guid, где каждый элемент — идентификатор пользователя, входящего в вычисленную роль.
Метод ResolveRole должен возвращать:
null-значений;Если роль не может быть определена, обработчик может вернуть пустой список.
В метод ResolveRole передаётся LifecycleRoleContext. Контекст:
DynamicCodeContext;Для логирования используется метод:
Task Log(string message, DynamicCodeLogLevel level = DynamicCodeLogLevel.Info);
Записи попадают в журнал вычисления ролей жизненного цикла.
Обработчик вызывается системой, когда нужно определить состав роли жизненного цикла для конкретной сущности. Примеры:
Ниже приведён пример обработчика, который возвращает автора сущности как единственного участника роли.
public class LifecycleRoleResolver : ILifecycleRoleResolver<Project>
{
public async Task<List<Guid>> ResolveRole(
LifecycleRoleContext context,
Project entity)
{
await context.Log($"Вычисление роли для сущности {entity.Id}");
return new List<Guid> { entity.AuthorId };
}
}
Пример, в котором состав роли определяется по связанным участникам проекта.
public class LifecycleRoleResolver : ILifecycleRoleResolver<Project>
{
public async Task<List<Guid>> ResolveRole(
LifecycleRoleContext context,
Project entity)
{
var memberService = context.GetEntityService<ProjectMember>();
var userIds = memberService
.Get(x => x.ProjectId == entity.Id)
.Select(x => x.UserId)
.Distinct()
.ToList();
await context.Log($"Для проекта {entity.Id} найдено участников: {userIds.Count}");
return userIds;
}
}
entity и связанных данных.context.Log(...).null.Перейти на русскую версию?