Records - так где их применять-то?
От: Yuri Abele Германия yabele.blogspot.com
Дата: 03.11.21 08:31
Оценка: +1
Привет!

С .NET работаю с самой первой beta версии. В IT еще дольше.
Разбираюсь use case-ами применения records и как не стараюсь, не могу найти.
Именно на практике, а не в теории.

Поделитесь пожалуйста, кто их практически применяет — где, для чего?

Спасибо заранее!
Re: Records - так где их применять-то?
От: Shmj Ниоткуда  
Дата: 03.11.21 09:29
Оценка:
Здравствуйте, Yuri Abele, Вы писали:

YA>Поделитесь пожалуйста, кто их практически применяет — где, для чего?

YA>Спасибо заранее!

Я всегда думал что это для сущностей EF. Но на практике пока не использовал.
Re: Records - так где их применять-то?
От: vaa  
Дата: 03.11.21 09:36
Оценка:
Здравствуйте, Yuri Abele, Вы писали:
YA>Поделитесь пожалуйста, кто их практически применяет — где, для чего?
При выходе 5-ки в одном проекте завел 3 записи типа, руками их не создаю, только путем десериализации получаю экземпляры, плюс в компактности
        public record SendResponse([property: JsonPropertyName("status")] string Status,
            [property: JsonPropertyName("status_code")] int StatusCode,
            [property: JsonPropertyName("status_text")] int StatusText,
            [property: JsonPropertyName("balance")] decimal Balance,
            [property: JsonPropertyName("sms")] IDictionary<string, ShortMessageSendResult> Results);


А вот для работы с той же EF уже не катит. да специфично.
сам поражаюсь ненужности.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Records - так где их применять-то?
От: Yuri Abele Германия yabele.blogspot.com
Дата: 03.11.21 10:04
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>Здравствуйте, Yuri Abele, Вы писали:

YA>>Поделитесь пожалуйста, кто их практически применяет — где, для чего?
vaa>При выходе 5-ки в одном проекте завел 3 записи типа, руками их не создаю, только путем десериализации получаю экземпляры, плюс в компактности
vaa>
vaa>        public record SendResponse([property: JsonPropertyName("status")] string Status,
vaa>            [property: JsonPropertyName("status_code")] int StatusCode,
vaa>            [property: JsonPropertyName("status_text")] int StatusText,
vaa>            [property: JsonPropertyName("balance")] decimal Balance,
vaa>            [property: JsonPropertyName("sms")] IDictionary<string, ShortMessageSendResult> Results);
vaa>


vaa>А вот для работы с той же EF уже не катит. да специфично.

vaa>сам поражаюсь ненужности.
Для ViewModels пожалуй да — они, по факту, только один раз создаются.
НО! Но для преобразования из Model во ViewModel (необходимо для подготовки Response), с использованием авто маппинга (например AutoMapper), необходим default конструктор без параметров — а это не records (если я правильно разобрался).

P.S. для NewtonJson можно сконфигурировать такое преобразование имён (snake_case <==> PascalCase) автоматически.
Re: Records - так где их применять-то?
От: Vladek Россия Github
Дата: 04.11.21 12:29
Оценка:
Здравствуйте, Yuri Abele, Вы писали:

YA>Привет!


YA>С .NET работаю с самой первой beta версии. В IT еще дольше.

YA>Разбираюсь use case-ами применения records и как не стараюсь, не могу найти.
YA>Именно на практике, а не в теории.

YA>Поделитесь пожалуйста, кто их практически применяет — где, для чего?


Объекты с наследованием и без, без поведения или с минимальным поведением, для передачи данных между разными слоями приложения. Обязательно с директивой init для всех свойств. Так же очень удобно использовать вместе с Dapper.

То есть, для DTO и DBO.
Re: Records - так где их применять-то?
От: Doc Россия http://andrey.moveax.ru
Дата: 05.11.21 03:42
Оценка: 4 (1)
Здравствуйте, Yuri Abele, Вы писали:

YA>Поделитесь пожалуйста, кто их практически применяет — где, для чего?


Удобно делать record для Id. Т.е. не
class User { public int Id { get; } ... } 
class Product { public int Id { get; } ... }

а
class User { public UserId Id { get; } ... } 
class Product { public ProductId Id { get; } ... }


Соответственно (утрированно) user.Id = product.Id уже не пройдет.
Более того, такой Id может быть составным и содержать несколько свойств (которые в итоге замапятся на композитный ключ в БД).
Re: Records - так где их применять-то?
От: #John Европа https://github.com/ichensky
Дата: 05.11.21 20:04
Оценка:
Здравствуйте, Yuri Abele, Вы писали:

YA>Поделитесь пожалуйста, кто их практически применяет — где, для чего?


В чистой архитектуре в DDD Value Objects можно представить как records , т.к. Value Objects должны быть имутабельны и не иметь идентификации, а если Value Objects сравниваются, то должны сравниваться сразу по всем полям.
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re[2]: Records - так где их применять-то?
От: vaa  
Дата: 07.11.21 15:13
Оценка:
Здравствуйте, Doc, Вы писали:


Doc>
Doc>class User { public UserId Id { get; } ... } 
Doc>class Product { public ProductId Id { get; } ... }
Doc>


и как это нормально работает с EF?
без дополнительных настроек? и select и saveChange?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Records - так где их применять-то?
От: Doc Россия http://andrey.moveax.ru
Дата: 08.11.21 04:19
Оценка: 4 (1)
Здравствуйте, vaa, Вы писали:

vaa>и как это нормально работает с EF?


Мы не сохраняем модели напрямую, есть маппинг на entities которые представляют уже собой талицы БД или другие хранилища (и они не обязательно 1 в 1 с моделями).
У нас все ок, но конечно это не ответ на исходный вопрос

В сети читал что делают, когда хочется сразу сохранять такие классы в EF — создают Value Conversions, который автоматом мапит такие record на таблицу.
https://thomaslevesque.com/2020/12/23/csharp-9-records-as-strongly-typed-ids-part-4-entity-framework-core-integration/
Re[4]: Records - так где их применять-то?
От: vaa  
Дата: 08.11.21 10:08
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Здравствуйте, vaa, Вы писали:


vaa>>и как это нормально работает с EF?


Doc>Мы не сохраняем модели напрямую, есть маппинг на entities которые представляют уже собой талицы БД или другие хранилища (и они не обязательно 1 в 1 с моделями).

Doc>У нас все ок, но конечно это не ответ на исходный вопрос

понятно, но все же не очень удобно использовать записи, если нужно извлечь из бд, изменить и сохранить. т.е. придется писать with и context.Entity().State = Attach.
вообщем огород нехилый. в таких случаях конечно ОРМ становится препятствием.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: Records - так где их применять-то?
От: Doc Россия http://andrey.moveax.ru
Дата: 09.11.21 03:13
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>понятно, но все же не очень удобно использовать записи, если нужно извлечь из бд, изменить и сохранить. т.е. придется писать with и context.Entity().State = Attach.


Зачем? Может что-то упустил, но чем Value Conversions не подходят?
Re[6]: Records - так где их применять-то?
От: vaa  
Дата: 09.11.21 04:34
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Здравствуйте, vaa, Вы писали:


vaa>>понятно, но все же не очень удобно использовать записи, если нужно извлечь из бд, изменить и сохранить. т.е. придется писать with и context.Entity().State = Attach.


Doc>Зачем? Может что-то упустил, но чем Value Conversions не подходят?

Value Conversions работают норм? Писали, что какие-то сложности возникают в linq to sql.
record по умолчанию иммутабельный же, а кастомить его это как обычный класс почти описать. мое субъективное, пока опыта нет.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[6]: Records - так где их применять-то?
От: vaa  
Дата: 09.11.21 07:47
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Зачем? Может что-то упустил, но чем Value Conversions не подходят?

Допустим имеем сущности:
public record ItemId(int Id);
public record Item (ItemId Id, string Name);

Как добавить новую запись в ОРМ типа ef core?
record требует что-то типа:
 new(new ItemId(???), "Alice")

Не ясно как обойти это ограничение, как получить автогенерацию для ключа.
Если есть где-то примеры, был бы рад изучить.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[6]: Records - так где их применять-то?
От: vaa  
Дата: 09.11.21 08:08
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Зачем? Может что-то упустил, но чем Value Conversions не подходят?

https://docs.microsoft.com/en-us/dotnet/csharp/fundamentals/types/records
если я правильно перевел, записи вообще не подходят для ОРМ EF

Value equality
For records, value equality means that two variables of a record type are equal if the types match and all property and field values match. For other reference types such as classes, equality means reference equality. That is, two variables of a class type are equal if they refer to the same object. Methods and operators that determine equality of two record instances use value equality.

Not all data models work well with value equality. For example, Entity Framework Core depends on reference equality to ensure that it uses only one instance of an entity type for what is conceptually one entity. For this reason, record types aren't appropriate for use as entity types in Entity Framework Core.

Immutability
An immutable type is one that prevents you from changing any property or field values of an object after it's instantiated. Immutability can be useful when you need a type to be thread-safe or you're depending on a hash code remaining the same in a hash table. Records provide concise syntax for creating and working with immutable types.

Immutability isn't appropriate for all data scenarios. Entity Framework Core, for example, doesn't support updating with immutable entity types.

☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Records - так где их применять-то?
От: Somescout  
Дата: 09.11.21 12:19
Оценка:
Здравствуйте, Yuri Abele, Вы писали:

YA>Привет!


YA>С .NET работаю с самой первой beta версии. В IT еще дольше.

YA>Разбираюсь use case-ами применения records и как не стараюсь, не могу найти.
YA>Именно на практике, а не в теории.

YA>Поделитесь пожалуйста, кто их практически применяет — где, для чего?


YA>Спасибо заранее!


Вот тоже не понимаю. Ждал чего-то подобного как удобный способ инициализации объектов (т.е. возможность объявить все зависимости DI один раз в конструкторе), а в итоге получилось что-то совсем непонятное в плане удобства.
ARI ARI ARI... Arrivederci!
Re[7]: Records - так где их применять-то?
От: Doc Россия http://andrey.moveax.ru
Дата: 10.11.21 07:48
Оценка:
Здравствуйте, vaa, Вы писали:

Doc>>Зачем? Может что-то упустил, но чем Value Conversions не подходят?

vaa>Value Conversions работают норм? Писали, что какие-то сложности возникают в linq to sql.

Использовали не часто, но проблем у нас не было.
Re[7]: Records - так где их применять-то?
От: Doc Россия http://andrey.moveax.ru
Дата: 10.11.21 07:51
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>если я правильно перевел, записи вообще не подходят для ОРМ EF


Тут речь про record как entity, а я выше говорил про случае когда entity это class, который содержит record (например Id).
Re[2]: Records - так где их применять-то?
От: Ночной Смотрящий Россия  
Дата: 10.11.21 09:27
Оценка:
Здравствуйте, Somescout, Вы писали:

S>Вот тоже не понимаю. Ждал чего-то подобного как удобный способ инициализации объектов (т.е. возможность объявить все зависимости DI один раз в конструкторе), а в итоге получилось что-то совсем непонятное в плане удобства.


Рекорды с DI зависимостями. Вот это точно что то очень странное.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[3]: Records - так где их применять-то?
От: Somescout  
Дата: 10.11.21 10:25
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Рекорды с DI зависимостями. Вот это точно что то очень странное.


Не записи, просто способ объявления полей класса в конструкторе, чтобы вместо:

class Test {
  private readonly DBContext dbContext;
  private readonly ADContext adContext;

  public Test(DBContext dbContext, ADContext adContext) {
    this.dbContext = dbContext;
    this.adContext = adContext;
  }
}


Который абсолютно шаблонен, написать просто:
class Test {
  public Test(
    private readonly DBContext dbContext,
    private readonly ADContext adContext
  ) { }
}


Мелкая экономия в принципе, но устраняет постоянно повторяющийся код.
ARI ARI ARI... Arrivederci!
Re[4]: Records - так где их применять-то?
От: Ночной Смотрящий Россия  
Дата: 10.11.21 10:36
Оценка:
Здравствуйте, Somescout, Вы писали:

S>Не записи, просто способ объявления полей класса в конструкторе, чтобы вместо:


Рекорды предназначены для сценария DTO. Делать DTO с DI зависимостями — очень нестандартная идея.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.