Вызов аспекта PostSharp только один раз для экземпляра

Я использую аспект 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)));

            }

        }
}

person Tomas    schedule 05.10.2011    source источник


Ответы (1)


Вам нужно будет реализовать 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.

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

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

person Dustin Davis    schedule 05.10.2011