Инструменты, о которых вы не слышали
Как разработчик .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
для преобразования текста string
of 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.
Если вы нашли эту статью полезной, похлопайте ей в ладоши.
Отказ от ответственности: часть этой статьи была написана с помощью инструмента искусственного интеллекта.
Но автор просмотрел и отредактировал содержимое.