1

私はasp.net webapiプロジェクトを持っており、コントローラー内のメソッドでアスペクト指向のプログラミングを行うことができました

[Audit("Getting all foos")]
public IEnumerable<Foo> GetAll()
{
    return _fooService.GetAll();
}

私が作成したアスペクト/属性は、Audit と呼ばれます。私はオブジェクトの作成に ninject を使用していますが、他の場所では側面が独自に作成されます。

これにより 2 つの問題が発生します。まず、アスペクトにプロパティを挿入できないため、アスペクト内に手動でオブジェクトを作成する必要があります。

第二に、監査アスペクトの作成の作成動作をオーバーライドできないため、ユニットテストが壊れているため、テスト中に模擬的なものではなく実際のものが作成されます。

私は IOC や ninject の経験があまりないので、正直なところ、少し混乱しています。

ninject を介してこれらの側面の作成を強制する方法はありますか?


それが役立つ場合は、すべてのライブラリの最新バージョンを使用しています。

私もNinject Interceptに出くわしましたが、それについては非常に間違っている可能性がありますが、postsharp の代替のように思えます。

4

1 に答える 1

4

Postsharp は、コンパイル後にコードを変更します。このアプローチでは、Ninject が依存関係を渡す方法はありません。ただし、できることがいくつかあります。

  1. 依存関係が必要なアスペクトには Ninject Interception を使用します。これは動作が異なります。Ninject はデコレータ クラスを動的に作成し、呼び出しの前後にアスペクトを呼び出します。そうすれば、いくつかの依存関係をアスペクトに渡すことができます。

  2. アスペクトは通常、横断的な関心事に使用されます。このような状況では、依存関係のアンビエント コンテキストを作成することは完全に合理的です。これは、IAuditLog などの 1 種類の依存関係のみを提供する静的クラスです。

.

public static class AuditLogProvider
{
    public static AuditLog 
    {
        get { return autitLog; }
        set {
                if (this.auditLog != null) throw new InvlaidOperationExcpetion("Audit is already configured"); 
                this.auditLog = value; 
            }
    }
}

ブートストラップで、そのアンビエント コンテキストを初期化できるようになりました。

AuditLogProvider.AutitLog = kernel.Get<IAuditLog>();
于 2012-11-01T12:25:52.220 に答える