3

アスペクトを使用したいメソッドが1つ(そして1つだけ)あります。IModule.Initializeです。(このメソッドは、私のソリューションの約15のクラスにあります)

次のようになります。

[LogToSplashScreen]
public void Initialize()
{
   RegisterViews();
   RegisterDesignTimeVMs();
}

メソッド本体が実行される前に、アスペクトでこれを実行したいと思います。

var moduleInfo = new ModuleInformation{ModuleName = "ClassNameHere"};
splashScreenService.ModuleLoadStart(moduleInformation);

そしてこの後:

splashScreenService.ModuleLoadEnd(moduleInformation);

補足:
私はこれを見て、PostSharpを試してみる時間だと思いました。チャンピオンのAOPツールだと聞きました。そこで、NuGetパッケージ(無料バージョンの入手を期待)を起動してインストールしました。

そしてそれはDemoWare(すなわち追加のインストーラー)でロードされます。個人的には気にしません。しかし、私の小さな問題を解決するためだけに、チームがインストーラーを処理する必要はありません。

そしてデモはさておき、UIがあるという事実は(私が推測しているように)私のビルドサーバーにとってそれを難し​​くします。(私はPackage Restoreを使用します。)

これらはすべて、アスペクト指向プログラミングに「オールイン」する場合に対処したいと思うことです。
しかし、私は1つだけ必要です...


多くの頭痛の種なしで「自分自身を転がす」方法はありますか?

4

1 に答える 1

1

PostSharpをすぐに書き留めることはできません。質問/問題をSharpCraftersフォーラムに投稿することをお勧めします。現在の問題は小さなものですが、AOPが役立つ他の問題に遭遇した場合は、少量であっても、PostSharp、CastleDynamicProxyなどのツールが必要になる可能性があります。

「自分でローリング」する限り、デコレータパターンを使用することができます。変数がどこmoduleInformationから来ているのかわかりません。実際に入力するつもりだったと思いますmoduleInfo

次に、インターフェイスが次のようになっていると仮定します。

public interface IModule
{
    void Initialize();
}

また、IModuleを実装するクラスは最大15個あります。ModuleInformationに関連するいくつかの機能を追加したいので、デコレータクラスを作成します。

public class ModuleDecorator : IModule
{
    IModule _subject;
    public ModuleDecorator(IModule subject)
    {
        _subject = subject;
    }

    public void Initialize()
    {
        var moduleInfo = new ModuleInformation{ModuleName = "ClassNameHere"};
        splashScreenService.ModuleLoadStart(moduleInfo);

        _subject.Initialize();

        splashScreenService.ModuleLoadEnd(moduleInfo);
    }
}

ここで、最大15のクラスの1つをインスタンス化する場合は、次のようにデコレータを実行するだけです。

IModule obj = new ModuleDecorator(new OneOfMy15Classes());

もちろん、IoCコンテナを使用すると、それが改善されます(たとえば、StructureMap、Ninject、使用しているものは何でも)。

このデコレータパターンの使用は、PostSharpやその他のAOPツールが舞台裏で行うこととほぼ同じです。1つのインターフェイスで1つのメソッドに対して1つのデコレータのみが本当に必要な場合は、これが進むべき道だと思います。まだAOPツールを導入する必要はありません。しかし、基本的に同じことを行うが異なるインターフェイス用のデコレータを作成し始めると、すぐに手に負えなくなる可能性があります。そのときに、AOPツールを導入します。

編集:私はちょうど「ClassNameHere」に気づきました、あなたはそれをリフレクションを通して得ることができます_subject.GetType().Name

于 2012-08-11T14:27:09.867 に答える