5

私は何年も AOP を使ってきましたが、ソリューションに 100% 満足することはできませんでした。Spring.AOP のようなランタイム ウィービングを使用する AOP フレームワークは、クラスのインターフェイスを変更できません。Postsharp のようなポスト コンパイル タイム フレームワーク (他の誰かを知っている人はいますか?) を使用すると、それが可能になります。このサンプルを確認してください。クラスに INotifyPropertyChanged 実装が追加されます。-> http://www.postsharp.net/model/inotifypropertychanged

この AOP 機能は非常に優れていますが、すぐに問題が発生します...ホスティング アセンブリ内の新しいインターフェイスにアクセスしたい場合、インターフェイスはコンパイル後に追加されるため、コンパイルできません。そのため、「PropertyChanged が定義されていません」というエラーが発生します。したがって、クラスを別のアセンブリに分離することで、これを回避する必要があります。これにより、これらの AOP の利点を利用できます。アセンブリの反映された情報に基づいてソース コードを生成する T4 テンプレートを使用して、同じ「コンパイル後」の問題に遭遇したことを覚えています。OKなので、コンパイル後の時間が遅すぎる場合があります...

私が探しているのは、クラスのソース コードがビジュアル スタジオのユーザー定義ツールを介して解析され、部分クラスの C# ファイルにコードが生成されるソリューションです。(したがって、すべての AOP 適用クラスは部分的でなければなりません)

つまり、「プリコンパイル時 AOP」のようなものです。これは間違いなく可能であり、NRefactory をコード パーサーとして使用することで実行できます。さらに、Visual Studio は、コンパイル後の変更よりも、これをはるかに望んでいます。

したがって、このソリューションは、コンパイル後のウィーバーの欠点を解消します。ただし、AOP のすべての機能が提供されるわけではありません。しかし、AOP フレームワークと合わせれば、これは素晴らしいことです。

このようなフレームワークやディスカッションを知っている人はいますか?! どう思いますか ?

よろしく、トーマス

4

3 に答える 3

1

あなたが探しているのはpMixinsです。まだベータ版ですが、まさにあなたが探していること、つまりデザイン時の織り込みを行います。AOP コードは部分的なコード ビハインド クラスに生成されるため、設計時に使用できます。

つまり、これは 1 つのファイルでこれを行うことができ、コンパイラーが満足し、Visual Studio が満足し、resharper が満足することを意味します。

インターフェイスを定義します。

public interface ISomeInterface
{
    void SomeMethod();
}

インターフェイスの実装を作成します (これを Mixin と呼びます)。

public class SomeInterfaceImplementation : ISomeInterface
{
    public void SomeMethod()
    {
        //implementation
    }
}

ターゲット ファイルを定義します (Mixin を使用します)。

[pMixin(Mixin = typeof(SomeInterfaceImplementation))]
public partial class Target { }

SomeInterfaceとで動作するユーティリティ クラスを作成しましょうSomeInterfaceImplementation

public class Utility
{
    public void DoSomeWorkOnSomeInterface(ISomeInterface obj)
    {
        obj.SomeMethod();
    }

    public void DoSomeWorkOnImplementation(SomeInterfaceImplementation obj)
    {
        obj.SomeMethod();
    }
}

それでは、すべてが連携して動作するのを見てみましょう。

class Program
{
    private static void Main(string[] args)
    {
        //Call the mixed in method
        new Target().SomeMethod();

        //Target implements ISomeInterface is code-behind
        new Utility().DoSomeWorkOnSomeInterface(new Target());

        //Target has an implicit conversion operator to 
        //SomeInterfaceImplementation in code-behind
        new Utility().DoSomeWorkOnImplementation(new Target());
    }
}

これが機能する理由は、ファイルを保存するとすぐに、pMixins コード ジェネレーターがすぐにデザインタイム ウィービングを実行し、コード ビハインド ファイルを更新するためです。SomeMethodを に直接追加し、のクラス定義をTarget更新して実装し、変換演算子を作成します。TargetISomeInterface

開示:私は pMixins 開発チームに所属しています。

于 2014-07-09T17:44:45.167 に答える
1

あなたと私は実行可能な代替手段としてSNAPを使用することについて既に連絡を取り合っているので、同様の解決策を探している人のために、ここに私たちの議論の要約を投稿したいと思います.

つまり、SNAPは、コードをまったく変更しないランタイム AOP フレームワークを提供します。コンパイル後の手順はなく、予測可能で使いやすいランタイム インターセプトのみです。

于 2013-08-09T14:59:26.400 に答える
0

PostSharp の場合、メソッドを使用して、コンパイル後に導入されたインターフェイスにアクセスできますPost.Cast。これは、コンパイル後に検証される一種のキャスト演算子です。ドキュメントについては、 http://doc.postsharp.net/postsharp-3.0/Content.aspx/PostSharp-3.0.chm/html/M_PostSharp_Post_Cast__2.htmを参照してください。

于 2013-07-23T11:58:10.017 に答える