Инструменты, о которых вы не слышали

Как разработчик .NET вы всегда ищете новые инструменты и библиотеки, которые помогут вам создавать более качественные и эффективные приложения. Однако с таким количеством доступных вариантов может быть сложно найти скрытые жемчужины, которые стоят вашего времени и усилий. В этом блоге мы рассмотрим десять скрытых жемчужин для разработчиков .NET, о которых вы, возможно, не слышали. От библиотек для выполнения операций CRUD до высокопроизводительных фреймворков gRPC — эти инструменты помогут вам оптимизировать процесс разработки и улучшить общее качество ваших приложений. Независимо от того, являетесь ли вы опытным разработчиком .NET или только начинаете, этот пост предоставит ценную информацию о некоторых инструментах и ​​библиотеках, доступных для разработки .NET. Итак, давайте погрузимся и обнаружим скрытые жемчужины, которые поднимут ваши навыки разработки .NET на новый уровень!

1: Гуманизатор

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

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

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

var daysBetween = (endDate - startDate).TotalDays;
var humanizedDays = daysBetween.ToWords();

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

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

Если вы ищете инструмент, который может помочь вам очеловечить ваши данные и сделать их более понятными для ваших пользователей, вам стоит присмотреться к Humanizer. Убедитесь в этом сами, посетив репозиторий Humanizer на GitHub.

2: Маркдиг

Markdown — это популярный текстовый формат, широко используемый в веб-разработке, документации и даже в написании текстов. Он обеспечивает простой и понятный способ написания форматированного текста без необходимости использования сложных HTML-тегов. Однако обработка Markdown может быть сложной задачей, особенно если вам нужно сделать это эффективным и расширяемым образом. Здесь на помощь приходит Markdig — быстрый и расширяемый процессор Markdown для .NET.

Markdig разработан, чтобы быть быстрым, простым в использовании и легко настраиваемым. Он предоставляет полный набор функций для обработки Markdown, включая поддержку наиболее распространенных расширений, таких как оглавление, списки задач и т. д. Кроме того, он предоставляет надежный API, который упрощает расширение и настройку его функций.

Одна из лучших вещей в Markdig — это его производительность. Он предназначен для быстрой работы даже при работе с большими объемами текста. Это делает его идеальным для использования в приложениях, требующих обработки Markdowns в реальном времени, таких как форумы, вики и системы управления документами.

Вот простой пример того, как использовать Markdig для обработки string текста Markdown и преобразования его в HTML:

using Markdig;

var markdown = @"# Hello, World!
This is a sample of *Markdown* text.

- This is a bullet point
- Another bullet point

1. This is a numbered list
2. Another item in the list

You can even include [links](https://www.example.com) and images:

![Image Alt Text](https://www.example.com/image.jpg)";

var html = Markdown.ToHtml(markdown);

Console.WriteLine(html);

Этот код использует метод Markdown.ToHtml для преобразования текста stringof Markdown в его эквивалентное представление HTML. Вывод этого кода будет примерно таким:

<h1>Hello, World!</h1>
<p>This is a sample of <em>Markdown</em> text.</p>
<ul>
<li>This is a bullet point</li>
<li>Another bullet point</li>
</ul>
<ol>

Если вы ищете инструмент, который может помочь вам обрабатывать Markdown быстро, эффективно и расширяемым образом, вам стоит присмотреться к Markdig. Убедитесь в этом сами, посетив репозиторий Markdig на GitHub.

3: Свободная проверка

Библиотека для создания и запуска правил проверки для объектов .NET! Эта библиотека предоставляет простой и гибкий API для определения и проверки бизнес-правил для ваших объектов, что делает ее отличным инструментом для создания надежных и удобных в сопровождении приложений.

Вот простой пример того, как вы можете использовать FluentValidation для проверки объекта в C#:

using FluentValidation;

public class CustomerValidator : AbstractValidator<Customer>
{
    public CustomerValidator()
    {
        RuleFor(x => x.Surname).NotEmpty();
        RuleFor(x => x.Forename).NotEmpty().WithMessage("Please specify a first name");
        RuleFor(x => x.Discount).NotEqual(0).When(x => x.HasDiscount);
        RuleFor(x => x.Address).Length(20, 250);
        RuleFor(x => x.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
    }

    private bool BeAValidPostcode(string postcode)
    {
        // custom postcode validation logic goes here
    }
}

В этом примере определяется класс CustomerValidator, который расширяет AbstractValidator<Customer>, где Customer — это тип объекта, который вы хотите проверить. Правила проверки определяются с помощью метода RuleFor, указывающего свойство для проверки и логику проверки приложения. В этом примере правила включают запрет на использование пустых фамилий или имен, обеспечение того, чтобы скидка не равнялась нулю, если у клиента есть скидка, обеспечение того, чтобы адрес был в пределах определенной длины, и обеспечение того, чтобы почтовый индекс был действительным.

Вы можете использовать валидатор следующим образом:

var customer = new Customer();
var validator = new CustomerValidator();
var results = validator.Validate(customer);

if (!results.IsValid)
{
    // handle validation errors
}

Этот код создает экземпляр класса CustomerValidator и использует метод Validate для проверки объекта Customer. Метод Validate возвращает объект ValidationResult, который можно использовать для проверки правильности объекта и получения любых обнаруженных ошибок проверки.

FluentValidation — отличный инструмент для обеспечения качества и согласованности ваших данных, а его простой в использовании API делает его обязательным для любого разработчика .NET. Проверьте это на fluentvalidation.net.

4: Оцелот

Шлюз API для приложений .NET! Эта библиотека предоставляет единую точку входа для вашего API и упрощает управление сквозными задачами, такими как аутентификация, ограничение скорости и маршрутизация запросов.

Вот простой пример того, как вы можете использовать Ocelot в своем приложении .NET для маршрутизации запросов:

using Ocelot.Configuration.File;

var configuration = new FileConfiguration
{
    ReRoutes = new List<FileReRoute>
    {
        new FileReRoute
        {
            DownstreamPathTemplate = "/api/v1/values",
            DownstreamScheme = "http",
            DownstreamHostAndPorts = new List<FileHostAndPort>
            {
                new FileHostAndPort
                {
                    Host = "localhost",
                    Port = 5010,
                }
            },
            UpstreamPathTemplate = "/values",
        },
    },
};

var builder = new WebHostBuilder();

builder.ConfigureServices(s => {
    s.AddOcelot(configuration);
});

builder.UseStartup<Startup>();

var host = builder.Build();

host.Run();

В этом примере мы создаем объект FileConfiguration, определяющий правила маршрутизации для нашего API. Мы используем класс FileReRoute для указания шаблона нисходящего пути, схемы, хоста и порта, а также шаблона восходящего пути. В этом случае мы направляем все запросы к конечной точке /api/v1/values на локальный хост через порт 5010.

Затем мы настраиваем Ocelot в нашем приложении ASP.NET Core, вызывая AddOcelot в IServiceCollection в методе ConfigureServices. Метод UseStartup используется для указания класса запуска для нашего приложения. Наконец, мы создаем и запускаем веб-хост, используя методы Build и Run.

Ocelot упрощает управление вашими маршрутами API и предоставляет гибкое и масштабируемое решение для управления сквозными задачами в вашем приложении .NET. Проверьте это на ocelot.readthedocs.io.

К сожалению, проект больше не поддерживается активно, а это означает, что пользователи могут не получать поддержку и обновления, необходимые им для обеспечения бесперебойной работы своих приложений. Хотя это по-прежнему отличный инструмент, отсутствие обслуживания может вызывать беспокойство у некоторых пользователей. Однако для .NET по-прежнему доступно множество других отличных вариантов шлюза API, поэтому разработчикам не следует отговаривать от изучения других решений, которые активно поддерживаются и обновляются.

5: Полли

Устойчивость .NET и библиотека временной обработки ошибок! Эта библиотека упрощает выражение политик для приложений .NET, таких как повторная попытка, автоматический выключатель, тайм-аут и т. д.

Вот простой пример того, как вы можете использовать Polly для добавления поведения повторных попыток в ваше приложение .NET:

using System;
using System.Net.Http;
using Polly;

var policy = Policy
    .Handle<HttpRequestException>()
    .Retry(3, (exception, retryCount) =>
    {
        Console.WriteLine($"Retry attempt {retryCount}");
    });

var client = new HttpClient();

policy.Execute(() =>
{
    var response = client.GetAsync("https://www.example.com").Result;
    
    if (!response.IsSuccessStatusCode)
    {
        throw new HttpRequestException();
    }
});

В этом примере мы создаем объект Policy, используя методы Handle и Retry. Метод Handle используется для указания типа исключения, которое мы хотим повторить, в данном случае HttpRequestException. Метод Retry используется для указания количества повторных попыток и делегата, который будет вызываться после каждой повторной попытки.

Затем мы используем метод Execute для объекта политики, чтобы выполнить код, который мы хотим повторить. В этом случае мы используем объект HttpClient, чтобы сделать запрос GET к примерному URL-адресу. Если запрос терпит неудачу и возвращает неуспешный код состояния, мы бросаем HttpRequestException, чтобы вызвать поведение повторной попытки.

Polly упрощает повышение отказоустойчивости и отказоустойчивости ваших приложений .NET. Загляните на thepollyproject.org/

6: Магический лук

Высокопроизводительная платформа gRPC для .NET! Эта платформа упрощает создание быстрых и масштабируемых микросервисов в .NET.

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

using Grpc.Core;
using MagicOnion;
using MagicOnion.Server;

public interface IMyService : IService<IMyService>
{
    Task<int> SumAsync(int x, int y);
}

public class MyService : ServiceBase<IMyService>, IMyService
{
    public async Task<int> SumAsync(int x, int y)
    {
        return x + y;
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        var service = MagicOnionEngine.BuildServerServiceDefinition(isReturnExceptionStackTraceInErrorDetail: true);

        var server = new Server
        {
            Services = { service },
            Ports = { new ServerPort("localhost", 12345, ServerCredentials.Insecure) }
        };

        server.Start();

        Console.WriteLine("Server listening on port 12345");
        Console.WriteLine("Press any key to stop the server...");
        Console.ReadKey();

        server.ShutdownAsync().Wait();
    }
}

В этом примере мы определяем интерфейс для нашей службы gRPC, IMyServiceкоторый расширяет MagicOnion.IService<IMyService>. Этот интерфейс содержит методы, которые наша служба будет предоставлять через gRPC.

Затем мы реализуем этот интерфейс в классе MyService, который реализует метод SumAsync для возврата суммы двух целых чисел.

Далее в методе Main мы строим определение сервера с помощью MagicOnionEngine.BuildServerServiceDefinition и указываем порт для прослушивания. Наконец, мы запускаем сервер с помощью метода Start и выключаем его, когда пользователь нажимает любую клавишу.

MagicOnion упрощает создание быстрых и масштабируемых сервисов gRPC в .NET. Убедитесь в этом сами, посетив репозиторий на GitHub.

7: МедиатР

Простая, бескомпромиссная библиотека для создания управляемых событиями систем в .NET! Эта библиотека упрощает создание систем, управляемых событиями, с помощью простого и понятного API.

Вот простой пример того, как вы можете использовать MediatR для обработки запроса в .NET:

using MediatR;
using System.Threading;
using System.Threading.Tasks;

public class Ping : IRequest<string> { }

public class PingHandler : IRequestHandler<Ping, string>
{
    public Task<string> Handle(Ping request, CancellationToken cancellationToken)
    {
        return Task.FromResult("Pong");
    }
}

public class Program
{
    public static async Task Main(string[] args)
    {
        var mediator = new Mediator(type => new PingHandler());

        var result = await mediator.Send(new Ping());

        Console.WriteLine(result);
    }
}

В этом примере мы определяем запрос Ping, который представляет собой простое сообщение, которое будет обрабатывать наша система.

Затем мы определяем обработчик PingHandler, реализующий интерфейс MediatR.IRequestHandler<Ping, string>. Этот обработчик реализует метод Handle для возврата строки "Pong" при получении запроса Ping.

Наконец, в методе Main мы создаем экземпляр класса MediatR.Mediator и используем метод Send для отправки запроса Ping и получения результата.

MediatR упрощает создание управляемых событиями систем в .NET. Проверьте это на GitHub.

8: Скрутор

Библиотека для сканирования сборок и автоматической регистрации компонентов с помощью .NET Dependency Injection framework! Эта библиотека упрощает управление вашими зависимостями и обеспечивает регистрацию и доступность всех необходимых компонентов.

Вот простой пример того, как вы можете использовать Scrutor для регистрации компонентов в среде внедрения зависимостей:

using Microsoft.Extensions.DependencyInjection;
using Scrutor;

public class Program
{
    public static void Main(string[] args)
    {
        var services = new ServiceCollection();

        services.Scan(scan => scan
            .FromAssemblyOf<Program>()
            .AddClasses(classes => classes.AssignableTo<ITransientService>())
            .AsImplementedInterfaces()
            .WithTransientLifetime());

        var provider = services.BuildServiceProvider();
    }
}

public interface ITransientService { }

public class TransientService : ITransientService { }

В этом примере мы создаем новый экземпляр класса Microsoft.Extensions.DependencyInjection.ServiceCollection и используем метод Scan для сканирования сборки, содержащей класс Program.

Метод AddClasses используется для указания того, что мы хотим зарегистрировать все классы, реализующие интерфейс ITransientService. Метод AsImplementedInterfaces используется для регистрации этих классов в качестве их реализованных интерфейсов, а метод WithTransientLifetime используется для указания того, что эти компоненты должны иметь временное время жизни.

Наконец, мы используем метод BuildServiceProvider для создания экземпляра Microsoft.Extensions.DependencyInjection.ServiceProvider, который можно использовать для разрешения зависимостей.

Scrutor упрощает управление вашими зависимостями и гарантирует, что все необходимые компоненты зарегистрированы в среде внедрения зависимостей. Проверьте это на GitHub.

9: щеголеватый

Быстрая и простая ORM для .NET! Эта библиотека предоставляет легкий и простой способ взаимодействия с базами данных в приложениях .NET.

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

using System.Data.SqlClient;
using Dapper;

public class Program
{
    public static void Main(string[] args)
    {
        using (var connection = new SqlConnection("Data Source=(local);Initial Catalog=TestDB;Integrated Security=True"))
        {
            connection.Open();

            var query = "SELECT * FROM Customers";
            var customers = connection.Query<Customer>(query).ToList();
        }
    }
}

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
}

В этом примере мы создаем новый экземпляр класса System.Data.SqlClient.SqlConnection и используем метод Query для выполнения запроса к базе данных. Метод Query возвращает System.Collections.Generic.IEnumerable<T> из Customer объектов, которые можно использовать в нашем приложении.

Dapper предоставляет быстрый и простой способ взаимодействия с базами данных в приложениях .NET. Проверьте это на GitHub.

10: подделка

Библиотека для генерации поддельных данных в .NET! Эта библиотека представляет собой простой и удобный способ создания тестовых данных для ваших приложений .NET.

Вот простой пример того, как вы можете использовать Bogus для создания поддельных данных:

using Bogus;

public class Program
{
    public static void Main(string[] args)
    {
        var customerGenerator = new Faker<Customer>()
            .RuleFor(x => x.Name, f => f.Name.FullName())
            .RuleFor(x => x.Email, f => f.Internet.Email());

        var customers = customerGenerator.Generate(10);
    }
}

public class Customer
{
    public string Name { get; set; }
    public string Email { get; set; }
}

В этом примере мы используем класс Faker для создания генератора объектов Customer. Метод RuleFor позволяет нам указать значения для каждого свойства в нашем классе Customer. Наконец, мы используем метод Generate для создания 10 экземпляров класса Customer.

Bogus — это простой и удобный способ генерировать тестовые данные для приложений .NET. Проверьте это на github.com/bogus/bogus.

Если вы нашли эту статью полезной, похлопайте ей в ладоши.

Отказ от ответственности: часть этой статьи была написана с помощью инструмента искусственного интеллекта.
Но автор просмотрел и отредактировал содержимое.