我对面向方面的编程没有经验。但是,我已经阅读了 PostSharp 提供的大量 PDF 和文档,并且我认为我理解了范式的要点。我有一个非常独特的问题,我相信 AOP 可以用来解决它。我的困境如下:
许多类将继承自A
,可以是enabled
或disabled
。考虑一下B
,哪个extends A
。如果B
是disabled
,我希望禁用所有方法执行以及属性和变量访问/修改。也就是说,如果禁用B.ExecuteMethod();
,B.Property = newValue;
则不会有任何影响。B
此外,如果期望返回值,则该值将默认为0
or null
if B
is disabled
。也就是说,我希望对象和值具有预期的默认值。
我正在使用 PostSharp C# 库,它看起来非常强大且开发良好。我相信我的问题可以通过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
.
我的问题的根源是:我需要ModularAttribute
引用A
的Enabled
属性,这样只有在为真OnEntry
时才会执行代码。Enabled
由于这是一个类级别的方面,因此我无法参数化 to 的包装版本,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 是解决这个问题的合适选择;但是,由于我对这种范式缺乏经验,我可能会以错误的方式接近它。
任何指导将不胜感激。谢谢您的帮助,