私はアスペクト指向プログラミングの経験がありません。ただし、PostSharpから入手できるPDFやドキュメントをかなり読んだことがあり、パラダイムの要点を理解していると思います。私にはかなり独特の問題があり、AOPを使用してそれを解決できると思います。私の苦境は次のとおりです。
多くのクラスはから継承します。A
これはenabled
またはdisabled
です。を考えB
てみてくださいextends A
。B
の場合disabled
、すべてのメソッドの実行とプロパティ、および変数のアクセス/変更を無効にします。つまり、が無効になっている場合は効果がB.ExecuteMethod();
ありB.Property = newValue;
ませんB
。さらに、戻り値が期待される場合、値はデフォルトで、0
またはのnull
場合B
はになりdisabled
ます。つまり、オブジェクトと値のデフォルト値を期待したいと思います。
私はPostSharpC#ライブラリを使用しています。これは非常に強力で十分に開発されているようです。私の問題は。によって解決できると信じていますAttributeInheritance
。たとえば、次のA
ように定義できます。
[ModularAttribute(AttributeInheritance = MulticastInheritance.Multicast)]
public class A {
private bool m_enabled;
public A(){
m_enabled = true;
}
public bool Enabled() {
get {
return m_enabled;
}
set {
m_enabled = value;
}
}
}
とB
できextend A
ます。さらに、私の属性は次のModularAttribute
ように定義できます。
[Serializable]
public sealed class ModularAttribute : OnMethodBoundaryAspect {
public ModularAttribute() {
}
public override void OnEntry(MethodExecutionArgs args) {
// only execute code if enabled
}
}
この属性はに適用されB
ますB extends A
。
私の問題の根本は次のとおりです。がtrueの場合にのみコードを実行するように、のプロパティModularAttribute
を参照する必要があります。これはクラスレベルの側面であるため、スコープ外であるため 、ラップされたバージョンのtoをパラメーター化できません。A
Enabled
OnEntry
Enabled
m_enabled
ModularAttribute
ModularAttribute
その所有者全員がimplement
特定のものになると私が言うことができる方法はありinterface
ますか?もしそうなら、ModularAttribute
上記から特定のプロパティにアクセスできますinterface
か?もしそうなら、これは私の問題を解決するでしょう。
明確にするために、私はPostSharpに「class
使用することModularAttribute
が保証されている」と伝えたいと思いimplement C
ます。したがって、確実に機能するため、定義されているものにModularAttribute
アクセスできるようにします。C
C
次のように定義できます。
public interface C {
public bool Enabled();
}
したがって、ではModularAttribute
、私はの線に沿って何かをすることができます
if (attachedClass.Enabled == false) {
// don't execute code
} else {
// execute code
}
この問題は、より一般的なユーザーごとのレベルではなく、オブジェクトごとのレベルでの認証として認識される可能性があります。if, else
すべてにチェックを追加する必要がProperty
あり、Method
それextends A
は横断的関心事のようです。したがって、AOPはこの問題に適した選択肢だと思います。ただし、このパラダイムの経験が浅いため、間違った方法でアプローチしている可能性があります。
任意のガイダンスをいただければ幸いです。助けてくれてありがとう、