2013-07-23 10 views
5

私は何年もAOPと一緒に遊んでいましたが、解決策に100%満足していませんでした。 AOPランタイムウィービングを持つフレームワークは、Spring.AOPのように、クラスのインタフェースを変更することはできません。 ポスト・コンパイル時にPostsharp(誰かが誰かを知っていますか?)のようなフレームワークを使用できます。 このサンプルをチェックすると、クラスにINotifyPropertyChanged実装が追加されます。 - >あなたがホスティングアセンブリ内に新しいインターフェイスにアクセスする場合はインターフェースがコンパイル後に追加されるため、あなたは、 をコンパイルすることはできませんhttp://www.postsharp.net/model/inotifypropertychangedAOPコンパイルの時間は?

このAOP機能は本当に素晴らしいですが、あなたは非常にすぐにトラブルに実行... 。 "PropertyChanged is not defined"エラーが発生します。 したがって、クラスを別のアセンブリに分けることで、このようなAOPの利点を利用できるように、これを回避するのは厄介です。 アセンブリの反映された情報に基づいて、ソースコードを生成するT4-Templateを使用して、同じ「Postコンパイル時」の問題に遭遇しました。コンパイル時間が遅すぎることがあります...

私が探しているのは、クラスのソースコードがVisual Studioのユーザー定義ツールで解析されてから、C#ファイル、部分的なクラス。 (したがって、すべてのAOP適用クラスは部分的である必要があります)

「Pre-Compile-Time AOP」のようなものです。 これは間違いなく可能であり、NRefactoryをコードパーサーとして使用して行うことができます。 さらに、Visual Studioでは、コンパイル後の修正よりもずっとこのことが好きです。

このソリューションは、ポストコンパイル時の織り方の欠点を解消します。 しかし、AOPのすべての機能をあなたに与えるわけではありません。しかし、AOPフレームワークと一緒に、これは素晴らしいことです。

誰でもこのようなフレームワーク、またはディスカッションを知っていますか? あなたはどう思いますか?

種類について、PostSharpの場合はトーマス

答えて

0

、あなたは後のコンパイル時に検証されるキャスト演算子の一種である方法Post.Castを使用することにより、ポストコンパイル時に導入されたインタフェースにアクセスすることができます-時間。詳細については、http://doc.postsharp.net/postsharp-3.0/Content.aspx/PostSharp-3.0.chm/html/M_PostSharp_Post_Cast__2.htmを参照してください。

+0

ありがとう、私はあなたのコードに複雑さ(=キャスト)を追加するため、これはアーキテクチャへの影響です。 Anders Hejlsbergに「コンパイラーを開く」という尋ねたポイントの1つですか?引用:「コード契約の参加者は、おそらくコンパイラをフックする機能を評価していたでしょう。この必要性は大部分無視されています。出典:http://www.postsharp.net/blog/post/Anders-Hejlsberg-Dead-Body –

1

あなたと私はすでにSNAPを実行可能な代替手段として使用しているので、私は同様の解決策を探している人の利益のためにここでの議論の要約を投稿したいと考えました。

要するに、SNAPは、コードを変更しないランタイムAOPフレームワークを提供します。コンパイル後のステップはなく、予測可能で使いやすいランタイム・インターセプトだけです。

+0

ありがとう、私は静的製織とランタイムDIの両方のオプションは素晴らしいツールだと思います。私は静的な織り方が好きです。アーキテクチャの影響が少ないからです。もちろん、DIを使用すると、あなたの側面をよりコントロールすることができます。しかし、SNApでcongratz、あなたは素晴らしいプロジェクトを作った:) –

1

あなたが探しているものはpMixinsです。それはまだベータ版ですが、探しているものとまったく同じです:デザイン時に織ります。 AOPコードは部分的なコードビハインドクラスに生成されるため、設計時に利用できます。

だから、これは1つのファイルでこれを行うことができることを意味し、コンパイラが幸せで、Visual Studioが幸せで、ReSharperのは幸せです:

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

public interface ISomeInterface 
{ 
    void SomeMethod(); 
} 

は、インタフェースの実装を作成します。 (私はこのミックスインを呼び出す):

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

は(ミックスインを消費します)ターゲットファイルを定義しますなぜなら、すぐにあなたのように

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

この作品の理由がある:一緒にすべての作業を見てみましょう今

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

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

そして:

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

のはSomeInterfaceSomeInterfaceImplementationで動作するユーティリティクラスを作成してみましょう。ファイルを保存すると、pMixinsコードジェネレータは直ちに設計時にコードビハインドファイルを作成して更新します。 TargetSomeMethodを直接追加し、Targetのクラス定義を更新してISomeInterfaceを実装し、変換演算子を作成します。

開示:私はpMixins開発チームです。

+0

BTW @ Gael-Fraiteur - PostSharpは素晴らしいツールであり、C#のAOPに私を回したものです! –

+0

@Thomas Haller - あなたはNRefactoryで行うことができるというあなたの提案とまったく同じです。それはまさに私が使ったものです! –

関連する問題