4

アスペクト指向プログラミングを使用して繰り返しコードを挿入する代替手段はありますか。多くのプロパティを含むクラスがあり、プロパティの値が変更された場合、それをログに記録したいとします。

class Person 
{
 public string Name
 {
    get{return name;}
    set
    { 
      name = value;
      LogPropertyChanged("Name");
    }
  }

  public int Age
  {
    get{return age;}
    set
    { 
      age = value;
      LogPropertyChanged("Age");
    }
   }      
}

アスペクト指向プログラミングを使用せずに、セキュリティ チェック、ログ記録などの反復コードをどのように削除しますか。

4

6 に答える 6

0

もちろん、すべてを自分で実装することもできますが、もう一度、車輪を再発明する必要はありません。コンパイル時のインジェクション コードを除けば、実際にできることは何もありません。

于 2013-04-19T21:57:23.667 に答える
0

このような繰り返しのコード パターンの作成を簡素化するために、独自のコード スニペットをいつでも作成できます。さまざまな無料のコード スニペット エディターがあります。スニッピーを使用しています。SO に関する別の質問への回答で、そのようなコード スニペットを説明しています (INotifyPropertyChanged インターフェイスのプロパティを作成します): https://stackoverflow.com/a/8317280/880990

于 2013-04-20T16:43:18.953 に答える
0

外部のランタイム フレームワークを使用したくない場合は、モデル駆動型のアプローチを使用できます。コンピューターで読み取り可能な形式のビジネス モデル (つまり、xml またはデータベース定義を使用) があり、必要なソースコードを生成するためのコード ジェネレーターがあります。コードテンプレートを使用したモデルの。

dotnet-typed-datasets は、モデルベースのプログラミングの一例です。c# データセット ソースコードは xsd-dataset-model から生成されます。

mygenerationは、テンプレートを使用してデータベース モデルからソースコードを生成できるソフトウェアです。

于 2013-04-20T16:53:07.043 に答える
0

私も数ヶ月前にそれを行う方法を探していました. ここに私が行ったいくつかの研究があります。

アイデアは、リフレクションを介して MSIL コードをブートストラップして挿入する静的イニシャライザーを実行することです (たとえば、ロギングのために実行時に関数をラップします)。同様の概念が postsharp で既に利用可能ですが、それはライセンスされたソフトウェアであり、私の環境には適していません。

これらの次のリンクは、開始するのに役立ちます。

http://www.codeproject.com/Articles/37549/CLR-Injection-Runtime-Method-Replacer http://msdn.microsoft.com/en-us/library/h0x241a0.aspx

http://msdn.microsoft.com/en-us/library/aa288454(v=vs.71).aspx#vcwlkattributestutorialanchor3

これは .net プラットフォームの境界を本当に押し広げます。私は自分の仕事でまだ実装していません。

于 2013-04-19T23:44:09.007 に答える
0

サードパーティのツール (一般的に AOP の場合) なしでできる最善の方法はデコレータ パターンだと思いますが、それがパターンの多くの助けになるかどうかはわかりませんINotifyPropertyChanged。Filip の答え (またはそのようなもの) は、おそらく現在 C# で実行できる最高のものです。

あなたのチーム ポリシーは、私が知っている限りでは非常に制限的で厳格に見えますが、別の角度からあなたのチーム ポリシーの「抜け穴」を検討してみましょう: Fodyと呼ばれる IL 操作フレームワークがあり、多くのプラグイン (プラグインの 1 つ) PropertyChanged.FodyINotifyPropertyChangedと呼ばれる)を処理します。ビルド プロセス中に Fody はコンパイルされたアセンブリを変更しますが、結果のアセンブリ (つまり、出荷するコード) は Fody やプラグインに依存しません (たとえば、PostSharp を出荷する必要がある PostSharp や Castle DynamicProxy とは異なります)。 dll または Castle.Core.dll をプロジェクトに含めます)。

于 2013-04-22T01:30:59.247 に答える