Часто вам может понадобиться проверить параметры в своих методах, чтобы убедиться, что они содержат действительные данные. Что наиболее важно, вы часто можете захотеть защитить свои общедоступные методы API, убедившись, что параметры в этих методах имеют допустимые значения. Это обеспечит стабильную работу ваших API. Решение этой проблемы заключается в реализации аспектно-ориентированного программирования или АОП.

Аспектно-ориентированное программирование разделяет проблемы вашего приложения, уменьшает дублирование кода и беспорядок, а также улучшает ремонтопригодность и читаемость вашего кода. Есть несколько инструментов, которые вы можете использовать для реализации АОП в своих приложениях. PostSharp – одна из наиболее широко используемых фреймворков АОП. В этой статье обсуждается, как можно использовать PostSharp для проверки параметров методов в C #.

Для работы с примерами кода, приведенными в этой статье, в вашей системе должна быть установлена ​​Visual Studio 2019. Если у вас еще нет копии, вы можете скачать Visual Studio 2019 здесь.

Создание проекта консольного приложения .NET Core в Visual Studio

Прежде всего, давайте создадим проект консольного приложения .NET Core в Visual Studio. Предполагая, что в вашей системе установлена ​​Visual Studio 2019, выполните действия, описанные ниже, чтобы создать новый проект консольного приложения .NET Core в Visual Studio.

  1. Запустите интегрированную среду разработки Visual Studio.
  2. Нажмите «Создать новый проект».
  3. В окне «Создать новый проект» выберите «Консольное приложение (.NET Core)» из отображаемого списка шаблонов.
  4. Нажмите “Далее.
  5. В окне «Настроить новый проект» укажите имя и расположение для нового проекта.
  6. Щелкните “Создать”.

Мы будем использовать этот проект для работы с PostSharp в следующих разделах этой статьи.

Что такое аспектно-ориентированное программирование?

Аспектно-ориентированное программирование – это стиль программирования, который позволяет вам определять конкретные политики, которые, в свою очередь, могут использоваться для определения и управления сквозными проблемами в приложении. По сути, АОП – это парадигма программирования, которая упрощает адаптацию вашего приложения к изменениям.

PostSharp – один из самых популярных фреймворков, используемых для реализации АОП в приложениях. Вы можете воспользоваться преимуществами функций компилирования PostSharp во время компиляции, чтобы исключить повторяющийся код и укрепить ваше приложение. PostSharp проверяет скомпилированный код IL, а затем присоединяет действия к телу каждого метода, для которого определен аспект с использованием одного или нескольких атрибутов.

Создание настраиваемого абстрактного базового класса ParameterAttribute в C #

В новом проекте консольного приложения создайте класс настраиваемого атрибута с именем MethodParameterAttributeBase, как показано здесь:

[AttributeUsage(AttributeTargets.Parameter)]
public abstract class MethodParameterAttributeBase : Attribute
{
    public abstract void VerifyMethodParameter(ParameterInfo parameter, object value);
}

Абстрактный класс MethodParameterAttributeBase расширяет класс System.Attribute и содержит объявление метода с именем VerifyMethodParameter.

Создайте конкретный класс NotNullOrEmpty в C #

Затем мы создадим конкретный класс, который расширит ранее созданный абстрактный базовый класс. Этот класс переопределит метод VerifyMethodParameter, чтобы проверить, является ли значение, переданное в параметре, нулевым или пустым.

Создайте класс с именем NotNullOrEmpty, который расширяет абстрактный базовый класс с именем MethodParameterAttributeBase, как показано в листинге кода ниже.

public class NotNullOrEmpty : MethodParameterAttributeBase
    {
        public string Message { get; set; }
        public override void VerifyMethodParameter
        (ParameterInfo parameter, object value)
        {
            //We’ll need to write code here to validates the parameters
        }
    }

Свойство Message класса MethodParameterAttributeBase используется для хранения сообщения, отображаемого, когда один или несколько параметров имеют пустые или нулевые значения. Метод VerifyMethodParameter принимает в качестве параметра экземпляр класса System.Reflection.ParameterInfo, а также экземпляр класса объекта. В то время как первый извлекает метаданные о параметрах, переданных методу, второй сохраняет значения параметров. Метаданные о параметрах включают имя и тип параметров и их атрибутов.

Проверьте наличие пустых или пустых значений параметров в C #

В следующем фрагменте кода показано, как можно проверить наличие в параметрах нулевых или пустых значений.

public override void VerifyMethodParameter(ParameterInfo parameter, object value)
        {
            if (value == null)
                throw new ArgumentNullException(parameter.Name, Message);
            if (value != null && value.ToString().Length == 0)
                throw new ArgumentException(Message, parameter.Name);
        }

Когда значения, содержащиеся в параметрах, являются пустыми или нулевыми, генерируются соответствующие исключения. Если значение параметра равно null, создается экземпляр ArgumentNullException; если значение параметра пусто, создается экземпляр ArgumentException.

Вот полный исходный код класса NotNullOrEmpty:

[Serializable]
[AttributeUsage(AttributeTargets.Parameter)]
public class NotNullOrEmpty : MethodParameterAttributeBase
    {
        public string Message { get; set; }
        public override void VerifyMethodParameter
        (ParameterInfo parameter, object value)
        {
            if (value == null)
                throw new ArgumentNullException(parameter.Name, Message);
            if (value != null && value.ToString().Length == 0)
                throw new ArgumentException(Message, parameter.Name);
        }
    }

Создайте класс ValidateParameterAttributes в C #

Класс ValidateParameterAttributes расширяет класс OnMethodBoundaryAspect и переопределяет метод OnEntry. Здесь вам нужно будет написать необходимую логику для перебора коллекции параметров и проверки каждого параметра.

 [Serializable]
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor)]
 [ProvideAspectRole(StandardRoles.Validation)]
    public class ValidateParameterAttributes : OnMethodBoundaryAspect
    {
        public override void OnEntry(MethodExecutionArgs eventArgs)
        {
            ParameterInfo[] parameterInfoArray =
            eventArgs.Method.GetParameters();
            Object[] args = eventArgs.Arguments.ToArray();
            for (int index = 0; index < parameterInfoArray.Length; index++)
            {
                var parameterAttributeArray = parameterInfoArray[index].
                    GetCustomAttributes<MethodParameterAttributeBase>();
                foreach (MethodParameterAttributeBase parameterAttribute
                    in parameterAttributeArray)
                    parameterAttribute.VerifyMethodParameter
                    (parameterInfoArray[index], args[index]);
            }          
            base.OnEntry(eventArgs);
        }
    }

Протестируйте свое приложение АОП, прошедшее валидацию PostSharp

Наконец, вот как вы можете протестировать консольное приложение AOP с помощью метода Main.

 class Program
    {
        [ValidateParameterAttributes]
        public static void Display([NotNullOrEmpty
        ("Cannot be null or empty...")] object obj)
        {
            Console.WriteLine(obj.ToString());
        }
        static void Main(string[] args)
        {
            Display(null);
            Console.Read();
        }
    }

Когда вы запустите это приложение, выходные данные будут выглядеть, как показано на рисунке 1.

postharp aop в csharp 01 IDG

Рисунок 1: PostSharp в действии!

Вы можете улучшить эту реализацию, кэшируя информацию обо всех параметрах методов. Вы также можете кэшировать экземпляры ValidateParameterAttributes, которые украшают параметры метода. Затем вы можете использовать эти кэшированные экземпляры для выполнения проверок во время выполнения. Мы обсудим эту и другие интересные функции PostSharp в одном из следующих постов.

Авторские права © 2021 IDG Communications, Inc.


#Как #выполнить #проверку #помощью #PostSharp #на

Source link