Utilisez le filtre Abp pour réaliser la fonction "corbeille" des données commerciales

principe

La corbeille est lorsqu'un utilisateur supprime un enregistrement, au lieu de le supprimer directement de la base de données, il est placé dans la "corbeille" afin que l'utilisateur puisse restaurer les données en cas de besoin.

Dans le framework Abp, si l'entité implémente ISoftDelete, le marquage de l'entité pour suppression n'est pas une suppression physique, mais une "suppression logicielle"

public interface ISoftDelete
{
    /// <summary>
    /// Used to mark an Entity as 'Deleted'. 
    /// </summary>
    bool IsDeleted { get; set; }
}

Lorsque vous utilisez le référentiel pour supprimer un enregistrement, ABP définit automatiquement IsDeleted sur true et remplace l'opération de suppression par l'opération de modification. Les entités supprimées de manière réversible sont automatiquement filtrées lors de l'interrogation de la base de données.

En utilisant ce principe, le comportement "soft delete" peut être considéré comme étant mis dans la "corbeille", et le comportement "recovery" peut être considéré comme étant sorti de la "corbeille". L'acte de suppression définitive d'enregistrements est considéré comme une "suppression permanente", et la suppression définitive de tous les enregistrements "supprimés en douceur" revient à "vider la corbeille".

Je dois donc implémenter un filtre personnalisé pour afficher les entités supprimées.

créer un filtre

Définissez un filtre pour afficher uniquement les suppressions réversibles, nommé "OnlyShowSoftDelete"

public class FileDataFilters
{
    public const string OnlyShowSoftDelete = "OnlyShowSoftDelete";

}

Enregistrez le filtre dans le module, le paramètre isEnabledByDefault est faux et il n'est pas activé par défaut

Configuration.UnitOfWork.RegisterFilter(FileDataFilters.OnlyShowSoftDelete, false);

Dans DbContext, ajoutez la propriété IsOnlyShowSoftDeleteFilterEnabled pour déterminer si le filtre "afficher uniquement la suppression réversible" est activé dans le contexte de requête actuel

public bool IsOnlyShowSoftDeleteFilterEnabled => CurrentUnitOfWorkProvider?.Current?.IsFilterEnabled(FileStorage.Uow.FileDataFilters.OnlyShowSoftDelete) == true;

Dans DbContext, remplacez la méthode CreateFilterExpression pour filtrer automatiquement les entités supprimées de manière réversible lorsque le filtre "afficher uniquement les suppressions réversibles" est activé

protected override Expression<Func<TEntity, bool>> CreateFilterExpression<TEntity>()
{
    var expression = base.CreateFilterExpression<TEntity>();
    if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)))
    {
        Expression<Func<TEntity, bool>> softDeleteFilter = e => !IsOnlyShowSoftDeleteFilterEnabled || ((ISoftDelete)e).IsDeleted;
        expression = expression == null ? softDeleteFilter : CombineExpressions(expression, softDeleteFilter);
    }

    return expression;
}

utiliser le filtre

Renseigner

Lorsque vous interrogez une entreprise normale, il n'est pas nécessaire d'utiliser le filtre par défaut.

Lors de l'affichage des données dans la "Corbeille", vous devez désactiver le filtre AbpDataFilters.SoftDelete et activer le filtre FileDataFilters.OnlyShowSoftDelete.

Avant d'effectuer une requête (par exemple GetAll ou Get) à l'aide du référentiel, ajoutez le code suivant :

UnitOfWorkManager.Current.DisableFilter(AbpDataFilters.SoftDelete);
UnitOfWorkManager.Current.EnableFilter(FileDataFilters.OnlyShowSoftDelete);

supprimer

Lors de la suppression d'un enregistrement, l'enregistrement est placé dans la "corbeille" en appelant la méthode Delete() du référentiel. Appelez la méthode HardDelete() pour supprimer définitivement l'enregistrement.


public virtual async Task DeleteAsync(File file, bool isHardDelete = false)
{
    if (isHardDelete)
    {
        await _repository.HardDeleteAsync(file);  //永久删除
    }
    else
    {
        await _repository.DeleteAsync(file);       //放入“回收站”
    }
}

récupérer

Obtenez les enregistrements qui ont été "supprimés en douceur", appelez la méthode UnDelete () et sortez les enregistrements de la "corbeille"

UnitOfWorkManager.Current.DisableFilter(AbpDataFilters.SoftDelete);
UnitOfWorkManager.Current.EnableFilter(FileDataFilters.OnlyShowSoftDelete);

var currentFile = await _repository.GetAsync(file.Id);
currentFile.UnDelete();

Configuration du contrôleur pour la nouvelle version de Volo.Abp

La nouvelle version de Volo.Abp annule la méthode de configuration de chaîne et doit spécifier une interface pour le contrôleur.

Créez l'interface IOnlyShowSoftDelete :

public interface IOnlyShowSoftDelete
{
}

Ajouter une configuration pour définir l'état du contrôleur par défaut sur non activé

Configure<AbpDataFilterOptions>(options =>
{
    options.DefaultStates[typeof(IOnlyShowSoftDelete)] = new DataFilterState(isEnabled: false);
});

De même, dans DbContext, remplacez la méthode CreateFilterExpression pour filtrer automatiquement les entités supprimées de manière réversible lorsque le filtre "afficher uniquement les suppressions réversibles" est activé.

protected bool IsOnlyShowSoftDeleteFilterEnabled => DataFilter?.IsEnabled<IOnlyShowSoftDelete>() ?? false;

protected override Expression<Func<TEntity, bool>> CreateFilterExpression<TEntity>()
{
    var expression = base.CreateFilterExpression<TEntity>();

    if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)))
    {
        Expression<Func<TEntity, bool>> softDeleteFilter = e => !IsOnlyShowSoftDeleteFilterEnabled || ((ISoftDelete)e).IsDeleted;
        expression = expression == null ? softDeleteFilter : CombineExpressions(expression, softDeleteFilter);
    }

    return expression;
}


Injectez le service IDataFilter dans votre classe

private readonly IDataFilter _dataFilter;

public MyBookService(IDataFilter dataFilter)
{
    _dataFilter = dataFilter;
}

Utilisez les méthodes Enable et Disable de _dataFilter pour activer ou désactiver le filtre


public async Task<List<Book>> GetAllBooksAsync()
{
    if(input.IncludeTrash)
    {
        //临时显示软删除的记录
        using ( _dataFilter.Disable<ISoftDelete>())
        using ( _dataFilter.Enable<IOnlyShowSoftDelete>())
        {
            return await _bookRepository.GetListAsync();
        }
    }
    else
    {
        return await _bookRepository.GetListAsync();
    }
}

Ou utilisez UnitOfWorkManager pour résoudre le service IDataFilter

using (input.IncludeTrash ? this.UnitOfWorkManager.Current.ServiceProvider.GetRequiredService<IDataFilter<ISoftDelete>>().Disable() : NullDisposable.Instance)
using (input.IncludeTrash ? this.UnitOfWorkManager.Current.ServiceProvider.GetRequiredService<IDataFilter<IOnlyShowSoftDelete>>().Enable() : NullDisposable.Instance)
{
    return await _bookRepository.GetListAsync();
}

Guess you like

Origin blog.csdn.net/jevonsflash/article/details/131802169