私はアスペクト指向プログラミングの経験がありません。ただし、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をパラメーター化できません。AEnabledOnEntryEnabledm_enabledModularAttribute
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はこの問題に適した選択肢だと思います。ただし、このパラダイムの経験が浅いため、間違った方法でアプローチしている可能性があります。
任意のガイダンスをいただければ幸いです。助けてくれてありがとう、