Переопределить аспект PostSharp базового класса в производном классе

У меня есть общий класс репозитория с различными методами, помеченными аспектом PostSharp (SecuredOperation)...

public class Repository<TEntity> : IRepository<TEntity>, ISecurable
    where TEntity : class, IEntity
{      
    ...

    [SecuredOperation(DomainAccess.Write)]        
    public virtual void Add(TEntity entity)
    {
        this.Context.AddEntity(entity);
    }

    ...
}

В некоторых из моих производных классов репозитория я хочу изменить требуемый доступ к методу Add() (например, DomainAccess.None).

Моя первоначальная попытка состояла в том, чтобы переопределить метод и повторно применить аспект...

public class SomeRepository : Repository<SomeEntity>
{       
    ...

    [SecuredOperation(DomainAccess.None)]
    public override void Add(SomeEntity entity)
    {
        base.Add(entity);
    }

    ...
}

Аспект правильно применяется к этому переопределенному методу, однако, как только я вызываю реализацию базового класса, аспект базового класса срабатывает.

Очевидно, что дублирование логики базового класса в производных классах не является решением.

Как обойти проблему переопределения аспекта базового класса в производном классе?


person Brett Postin    schedule 23.07.2013    source источник


Ответы (1)


Я не профессионал PostSharp, но я думаю, что вам нужно добавить и установить значение true для AttributeReplace в переопределенном методе. Существует также AllowMultiple

[SecuredOperation(DomainAccess.None, AttributeReplace = true)]
    public override void Add(SomeEntity entity)

Вы также можете определить аспект, чтобы он всегда переопределял предыдущий, добавив следующие

[MulticastAttributeUsage(MulticastTargets.Method, AllowMultiple = false)]

к определению класса аспекта.

Документ PostSharp ссылка

person Mikee    schedule 12.03.2014