Хобрук: Ваш путь к мастерству в программировании

Автоматическая проверка свойств

Иногда у меня есть действительно сложные модели со многими строковыми свойствами, которые необходимо проверять при настройке, однако проверка часто не идет дальше IsNotNullOrWhitespace.

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

Возможные решения

  • АОП (например, с PostSharp)
  • Быстрая проверка
  • Аннотации данных

Аннотации данных кажутся мне наиболее естественным способом, поскольку проверка очень близка к модели, а поскольку она является частью .Net-Framework, атрибуты в порядке. Однако, если я использую модель вне MVC или сериализации, мне приходится выполнять проверку вручную с помощью валидатора. Таким образом, я должен выполнить проверку, вероятно, во многих местах (репозитории, API, службы), и если я где-то забуду об этом, правила моего домена могут быть нарушены.

АОП может быть идеальным способом, однако в C# нет такой вещи, и тесное связывание моих моделей предметной области с инфраструктурным компонентом, таким как PostSharp или Ninject (перехват), недопустимо.


  • Когда необходимо пройти валидацию? Когда @setter, да, вы должны использовать АОП. Вы можете заглянуть в бесплатный сайт Fody (github.com/Fody/Fody). ваша озабоченность по поводу связи с компонентами инфраструктуры. В любом случае, я должен спросить: вы бы предпочли иметь больше кода и платить за него и его обслуживание снова и снова, или вы предпочитаете зависеть от компонента инфраструктуры, ускоряющего разработку и снижающего вероятность ошибок? Что является компонентом инфраструктуры, а что нет? Вы полагаетесь на VS или используете (любой) текстовый редактор, поскольку связь вас слишком беспокоит? ;-) 22.05.2014

Ответы:


1

Попробуйте инфраструктуру NConcern AOP.

Эта новая минимальная среда выполнения AOP (над которой я активно работаю) может помочь вам управлять проверкой с помощью AOP, не связывая вашу сборку домена.

В своей сборке проверки определите свой собственный атрибут проверки и способ его проверки.

Пользовательский атрибут для определения/идентификации электронной почты

[AttributeUsage(AttributeTargets.Property)]
public class Email : Attribute
{
    //validation method to use for email checking
    static public void Validate(string value)
    {
        //if value is not a valid email, throw an exception!
    }
}

Аспект проверки для проверки контракта кода

//Validation aspect handle all my validation custom attribute (here only email)
public class EmailValidation : IAspect
{
    public IEnumerable<IAdvice> Advise(MethodInfo method)
    {
        yield return Advice.Before((instance, arguments) =>
        {
            foreach (var argument in arguments)
            {
                if (argument == null) { continue; }
                Email.Validate(argument.ToString());
            }
        });
    }
}

Сборка вашего домена

public class Customer
{
    [Email]
    public string Login { get; set; }
}

В другую сборку (связь между проверкой и доменом

//attach validation to Customer class.
foreach (var property in typeof(Customer).GetProperties())
{
    if (property.IsDefined(typeof(Email), true))
    {
        Aspect.Weave<Validation>(property.GetSetMethod(true));
    }
}
24.11.2016
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..