3

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);
    }

    ...
}

アスペクトはこのオーバーライドされたメソッドに正しく適用されますが、基本クラスの実装を呼び出すと、基本クラスのアスペクトが開始されます。

明らかに、派生クラスで基本クラスのロジックを複製することは解決策ではありません。

派生クラスで基本クラスのアスペクトをオーバーライドするというこの問題を回避するにはどうすればよいですか?

4

1 に答える 1

0

私は PostSharp のプロではありませんが、オーバーライドされたメソッドでAttributeReplace値を追加して true に設定する必要があると思います。AllowMultiple もあります

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

以下を追加することで、以前のアスペクトを常にオーバーライドするようにアスペクトを定義することもできます。

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

アスペクトクラス定義に。

PostSharp ドキュメントリンク

于 2014-03-12T17:03:49.283 に答える