История тупняка.
В тестах я использую билдеры на минималках: создаю DTO и мутирую его с помощью универсального метода With
или специальных методов расширений. Это позволяет устанавливать только важные для теста поля. Выглядит так-то так:
var person = DefaultPerson().With(x => Name = "Вася");
//или
var person = DefaultPerson().WithName("Вася");
И вот мне понадобилось в таком стиле работать с рекорадми, а они не мутируются. Ну я такой не растерялся, вспомнил, что есть нормальная реализация паттерна builder, когда мы сначала настраиваем builder, а потом потом уже создаём интересующий нас объект. Выглядит так раньше, только есть вызов Build()
.
var person = DefaultPerson().WithName("Вася").Build();
Минус в том, что билдер нужно писать, поэтому вспомнил про source-generators, нашёл библиотеку в которой просто объявляешь класс билдера, вешаешь атрибут, а остальное она сделает сама. Выглядит вот так:
[AutoGenerateBuilder(typeof(PersonDto))]
public partial class PersonDtoBuilder
{
}
А потом решил загуглить как народ выкручивается, искал по запросу C# record builder
. И нашёл, что можно просто использовать ключевое слово with
. Очень просто:
DefaultPerson() with {Name = "Вася" };
И знаете что? Я знал про with
, просто никогда не пользовался и забыл. Такой вот тупняк на ровном месте.