PostSharp аспект вызова только один раз за экземпляр - PullRequest
1 голос
/ 05 октября 2011

Я использую аспект PostSharp ниже для проверки свойства класса.

    [ProtoContract]
    public sealed class Web2Image : WebEntity
    {
      [ProtoMember(1009), Validator.Collection(Data = new[] { "jpg", "bmp", "png", "tiff" })]
        public override string OutputFormat { get; set; } 
}

Свойство OutputFormat проверяется при первом доступе к свойству, но проверка выполняется во второй и третий раз при обращении к свойству в коде.Я хотел бы ограничить выполнение Aspect только один раз для каждого экземпляра класса для моего свойства.Как это сделать?

  public class Validator
    {

        [Serializable]
        [Collection(AttributeExclude = true)]
        [MulticastAttributeUsage(MulticastTargets.Property)]
        public class Collection : LocationInterceptionAspect
        {
            public string[] Data;

            public override void OnGetValue(LocationInterceptionArgs args)
            {

                SiAuto.Main.LogObject("FieldAccessEventArgs " + Reflection.AssemblyHelper.EntryAssembly, args);
                /*   SiAuto.Main.LogObject("FieldAccessEventArgs " + Reflection.AssemblyHelper.EntryAssembly, args.Binding.ToString());*/

                args.ProceedGetValue();
                if (args.Value == null)
                {
                    args.Value = Data[0];
                    args.ProceedSetValue();
                }

                foreach (var s in Data)
                {
                    if (args.Value.ToString().ToLower() == s.ToLower())
                        return;

                }

                throw new EngineException(string.Format("Value \"{0}\" is not correct. {1} parameter can accept only these values {2}", args.Value, args.LocationName, string.Join(",", Data)));

            }

        }
}

1 Ответ

0 голосов
/ 05 октября 2011

Вам нужно будет реализовать IInstanceScopedAspect. См. http://www.sharpcrafters.com/blog/post/Day-9-Aspect-Lifetime-Scope-Part-1.aspx и http://www.sharpcrafters.com/blog/post/Day-10-Aspect-Lifetime-Scope-Part-2.aspx для получения дополнительной информации о сроке службы и объеме аспектов, включая способы реализации IInstanceScopedAspect.

Это даст вам аспект для каждого экземпляра (потому что сейчас это один раз для каждого типа).

Что касается проверки, вы можете установить переключатель (если true, выйти в противном случае, выполнить проверку) или проверить, является ли он нулевым (или другим начальным значением).

...