Как разделить определенные метаданные между несколькими аспектами, примененными к одному и тому же объекту?

1

У меня есть три аспекта, применяемые к определенному классу:

[Serializable]
[MulticastAttributeUsage(PersistMetaData = true)]
public class MetaDataAspect : LocationInterceptionAspect, IInstanceScopedAspect
{
    public MetaData ThisMetaData = new MetaData();

    public object CreateInstance(AdviceArgs adviceArgs) { return MemberwiseClone(); }
    public void RuntimeInitializeInstance() {}
}

[Serializable]
[MulticastAttributeUsage(MulticastTargets.Method)]
public class CallInterceptionAspect : MethodLevelAspect, IMethodInterceptionAspect
{
    public void OnInvoke(MethodInterceptionArgs args){
        GetMetaData().ThisMetaData.Id = args.Arguments[0];
    }
}

[Serializable]
[MulticastAttributeUsage(MulticastTargets.Property)]
public class WmiClassPropertyAspect : LocationInterceptionAspect
{
    public override void OnGetValue(LocationInterceptionArgs args)
    {
        args.Value = GetMetaData().ThisMetaData.Id;
    }
}

Как реализовать метод GetMetaData() чтобы он дал мне ThisMetaData ThisMetaData?

Теги:
metaprogramming
aop
postsharp

1 ответ

1
Лучший ответ

Быстрый ответ - введите интерфейс и используйте его на основе методов.

В основном вам нужно сделать следующее:

public interface IThisMetaDataProvider
{
    Metadata ThisMetadata {get;}
}

[Serializable]
[MulticastAttributeUsage(PersistMetaData = true)]
[IntroduceInterface(typeof(IThisMetadataProvider))]
public class MetaDataAspect : LocationInterceptionAspect, IInstanceScopedAspect
{
    public Metadata ThisMetadata {get; private set;}

    public void RuntimeInitializeInstance() { ThisMetadata = new Metadata(); }

    ...
}

[Serializable]
[MulticastAttributeUsage(MulticastTargets.Method)]
public class CallInterceptionAspect : MethodLevelAspect, IMethodInterceptionAspect
{
    public void OnInvoke(MethodInterceptionArgs args)
    {
        ((IThisMetadataProvider)args.Instance).ThisMetaData.Id = args.Arguments[0];
    }
}

Вы также можете использовать IAspectProvider и IAspectRepositoryService (начиная с IAspectRepositoryService 4.0), чтобы автоматически предоставлять MetaDataAspect классу, когда CallInterception используется для метода.

  • 0
    введение интерфейса заставляет меня добавлять его свойство к каждому классу, который его реализует. IAspectProvider кажется, решение. Благодарю.
  • 0
    И это также требует платной версии PostSharp для IntroduceInterface . Я пользуюсь экспресс-выпуском ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню