У меня есть три аспекта, применяемые к определенному классу:
[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?
Быстрый ответ - введите интерфейс и используйте его на основе методов.
В основном вам нужно сделать следующее:
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 используется для метода.
IAspectProvider
кажется, решение. Благодарю.IntroduceInterface
. Я пользуюсь экспресс-выпуском ...