我会尝试用尽可能少的细节来解释这个问题,以保持简短的问题。如果需要更多详细信息,请与我们联系。
我在属性A上有一个方面X,它在属性B上动态生成一个方面Y.属性B可能已经包含Y类方面,它们相互交互并生成Y的实例。
我要求X生成的Y的实例在运行非生成的Y实例之前出现。使用AspectDependencies我无法完成这项工作。我放置了一个AspectDependencyPosition。
我放在X上的方面依赖关系是以下形式: [AspectTypeDependency(AspectDependencyAction.Order,AspectDependencyPosition.Before,typeof(Y))]
我得到的执行顺序是: SourceInstanceOfY,X,GeneratedInstanceOfY
虽然我需要的执行顺序是: X,SourceInstanceOfY,GeneratedInstanceOfY 最后两个可能会改变顺序。
有没有办法解决这个问题,或者PostSharp不支持它?
谢谢, 雷米。
答案 0 :(得分:1)
By using AspectTypeDependency you specified the ordering between aspects X and Y, but the order for Y instances is still not specified. You can use the ApectPriority property to order individual instances of the Y aspect. You can find the simple example based on your description below:
class TestClass
{
[MyAspectX]
public int PropertyA { get; set; }
[MyAspectY("from attribute", AspectPriority = 2)]
public int PropertyB { get; set; }
}
[Serializable]
public class MyAspectX : LocationInterceptionAspect, IAspectProvider
{
public override void OnGetValue(LocationInterceptionArgs args)
{
Console.WriteLine("X OnGetValue");
base.OnGetValue(args);
}
public IEnumerable<AspectInstance> ProvideAspects(object targetElement)
{
yield return new AspectInstance(
((LocationInfo) targetElement).DeclaringType.GetProperty("PropertyB"),
new MyAspectY("from provider") {AspectPriority = 1});
}
}
[Serializable]
public class MyAspectY : LocationInterceptionAspect
{
private string tag;
public MyAspectY(string tag)
{
this.tag = tag;
}
public override void OnGetValue(LocationInterceptionArgs args)
{
Console.WriteLine("Y OnGetValue " + tag);
base.OnGetValue(args);
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(new TestClass().PropertyB);
}
}