{"id":496314,"date":"2026-09-28T07:54:01","date_gmt":"2026-09-28T07:54:01","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=496314"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=496314","title":{"rendered":"\u041a\u0430\u043a \u0438 \u0437\u0430\u0447\u0435\u043c \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u0432\u043e\u0439 \u043c\u0430\u043f\u043f\u0435\u0440"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u042f \u043d\u0435 \u043b\u044e\u0431\u043b\u044e Clean Architecture, \u043d\u0435 \u043b\u044e\u0431\u043b\u044e DTO \u0438 \u043d\u0435 \u043b\u044e\u0431\u043b\u044e \u043c\u0430\u043f\u043f\u0435\u0440\u044b.<\/p>\n<p>\u041e\u043d\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0431\u0430\u0437\u0443 \u0432 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0447\u0435\u0442\u044b\u0440\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0442\u0440\u0438 \u0441\u043b\u043e\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0438 \u043f\u0430\u043f\u043a\u0443 Mappings, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u043b \u0441\u043e \u0432\u0440\u0435\u043c\u0451\u043d \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430. \u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435 \u043d\u0430 \u0444\u043e\u0440\u043c\u0443, \u043d\u0430\u0434\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, DTO, \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440, \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 \u0438 \u0442\u0435\u0441\u0442 \u043d\u0430 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430. \u0428\u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b\u043e\u0432 \u0440\u0430\u0434\u0438 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0438. \u0410 \u0435\u0441\u043b\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043d\u0438\u0445 \u0437\u0430\u0431\u044b\u0442\u044c, \u043d\u0438\u043a\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043a\u0430\u0436\u0435\u0442.<\/p>\n<p><strong>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043c\u0430\u043f\u043f\u0435\u0440.<\/strong><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043c\u0435\u0441\u0442\u0430, \u0433\u0434\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u043c\u0435\u0441\u0442\u0430, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u043c\u0430\u043f\u043f\u0435\u0440\u044b \u0438\u0445 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0438 \u0447\u0442\u043e \u044f \u0432 \u0438\u0442\u043e\u0433\u0435 \u0441 \u044d\u0442\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u043b.<\/p>\n<h2>\u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u043f\u043f\u0435\u0440<\/h2>\n<p>\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 CRUD. \u0415\u0441\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u0432 \u0431\u0430\u0437\u0435 \u0443 \u043d\u0435\u0451 \u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044c \u043f\u043e\u043b\u0435\u0439:<\/p>\n<pre><code class=\"cs\">public class User{    public Guid Id { get; set; }    public string FirstName { get; set; } = \"\";    public string LastName { get; set; } = \"\";    public string? Bio { get; set; }    public bool IsBlocked { get; set; }    public DateTimeOffset CreatedAt { get; set; }    \/\/ ...\u0438 \u0435\u0449\u0451 \u0434\u0432\u0430 \u0434\u0435\u0441\u044f\u0442\u043a\u0430}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438:<\/p>\n<pre><code class=\"cs\">public class UserResponse{    public Guid Id { get; init; }    public string FirstName { get; init; } = \"\";    public string LastName { get; init; } = \"\";    public bool IsBlocked { get; init; }}public class UpdateUserRequest{    public string FirstName { get; init; } = \"\";    public string LastName { get; init; } = \"\";    public string? Bio { get; init; }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u0442. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0440\u0435\u0437\u044b <code>User<\/code>. \u0421 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0445 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442 \u0434\u0432\u0430 \u043c\u0435\u0441\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0440\u0443\u043a\u0430\u043c\u0438.<\/p>\n<p>\u041c\u0435\u0441\u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0435 &#8212; \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435:<\/p>\n<pre><code class=\"cs\">var users = await db.Users    .Where(u =&gt; !u.IsBlocked)    .Select(u =&gt; new UserResponse    {        Id = u.Id,        FirstName = u.FirstName,        LastName = u.LastName,        IsBlocked = u.IsBlocked,    })    .ToListAsync(ct);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u043d\u0443\u0436\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0442\u0430\u0449\u0438\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0440\u0430\u0434\u0438 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u043f\u043e\u043b\u0435\u0439. \u041c\u0435\u043d\u044c\u0448\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0441\u0435\u0442\u0438, \u043d\u0435\u0442 \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430.<\/p>\n<p>\u041c\u0435\u0441\u0442\u043e \u0432\u0442\u043e\u0440\u043e\u0435 &#8212; \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0432 \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u043b\u0438 \u044d\u043d\u0434\u043f\u043b\u043e\u0438\u043d\u0442\u0435:<\/p>\n<pre><code class=\"cs\">var user = await db.Users.FindAsync([request.Id], ct);user.FirstName = request.FirstName;user.LastName = request.LastName;user.Bio = request.Bio;await db.SaveChangesAsync(ct);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u043d\u0443\u0436\u0435\u043d \u0447\u0442\u043e\u0431\u044b \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c overposting \u0432 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430\u0445.<\/p>\n<p>\u041f\u0440\u043e \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u0438\u0448\u0435\u0442 \u0441\u0442\u0430\u0442\u0435\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0451\u043c \u043d\u0435\u0447\u0435\u0433\u043e \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u0442\u044c. \u041d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0448\u044c.<\/p>\n<h3>\u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438 \u043d\u0435 \u0442\u0430\u043a<\/h3>\n<p>\u041f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435: \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u043d\u0443\u0436\u0435\u043d <code>CreatedAt<\/code>. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u044e \u043f\u043e\u043b\u0435 \u0432 \u043c\u043e\u0434\u0435\u043b\u044c:<\/p>\n<pre><code class=\"cs\">public class UserResponse{    \/\/ ...    public DateTimeOffset CreatedAt { get; init; } \/\/ \u043d\u043e\u0432\u043e\u0435}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0431\u044b\u0442\u044c \u0434\u043e\u043f\u0438\u0441\u0430\u0442\u044c <code>CreatedAt = u.CreatedAt<\/code> \u0432 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e, \u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u043d\u0438\u0447\u0435\u0433\u043e. Object initializer \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u0421\u0431\u043e\u0440\u043a\u0430 \u0437\u0435\u043b\u0451\u043d\u0430\u044f, \u0442\u0435\u0441\u0442\u044b \u0437\u0435\u043b\u0451\u043d\u044b\u0435, \u0430 \u0432 API \u0443\u0435\u0437\u0436\u0430\u0435\u0442 <code>0001-01-01T00:00:00<\/code>. \u0421\u0443\u0434\u044f \u043f\u043e \u043e\u0442\u0432\u0435\u0442\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043f\u0440\u0438 \u041e\u043a\u0442\u0430\u0432\u0438\u0430\u043d\u0435 \u0410\u0432\u0433\u0443\u0441\u0442\u0435.<\/p>\n<p>\u0421 \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u043e\u043c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435. \u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438, &#8212; \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0435\u0433\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c.<\/p>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443:<\/p>\n<ul>\n<li>\n<p>\u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u043b\u0435 \u0432 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 &#8212; \u0441\u0431\u043e\u0440\u043a\u0430 \u0443\u043f\u0430\u0434\u0451\u0442<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432 \u0446\u0435\u043b\u0438 &#8212; \u0442\u0438\u0448\u0438\u043d\u0430<\/p>\n<\/li>\n<\/ul>\n<h3>\u0410 \u043a\u0430\u043a \u0436\u0435 required?<\/h3>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0441\u043a\u0430\u0436\u0435\u0442: \u0432 C# 11 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c <code>required<\/code>.<\/p>\n<pre><code class=\"cs\">public class UserResponse{    public required DateTimeOffset CreatedAt { get; init; }}var r = new UserResponse { Id = Guid.NewGuid() };\/\/ error CS9035: Required member 'CreatedAt' must be set in the object initializer.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440. Runtime-\u043c\u0430\u043f\u043f\u0435\u0440\u044b \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044e \u0438\u043b\u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043c\u0438\u043c\u043e object initializer. \u0414\u043b\u044f \u043d\u0438\u0445 <code>required<\/code> &#8212; \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e. \u042d\u0442\u043e \u043d\u0435 \u043d\u0435\u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0430 \u043f\u0440\u044f\u043c\u043e\u0435 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u0440\u0430\u043d\u0442\u0430\u0439\u043c-\u043f\u043e\u0434\u0445\u043e\u0434\u0430.<\/p>\n<p>\u0418\u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435:<\/p>\n<ul>\n<li>\n<p>\u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f <code>IQueryable<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 SQL \u0438 \u0441\u0430\u043c\u0430 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u0438<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0442\u0440\u0435\u043a\u0430\u0435\u0442 EF, \u0431\u0435\u0437 \u0435\u0451 \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432 \u0446\u0435\u043b\u0438 &#8212; \u044d\u0442\u043e \u0441\u0438\u0433\u043d\u0430\u043b \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0441\u0431\u043e\u0440\u043a\u0438, \u0430 \u043d\u0435 <code>null<\/code> \u0432 \u043f\u0440\u043e\u0434\u0435<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430. \u0414\u0432\u0430 \u043c\u0435\u0441\u0442\u0430 \u0438 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0439.<\/p>\n<h2>\u0427\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u0440\u044b\u043d\u043a\u0435<\/h2>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438. <span class=\"habrahidden\">\u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u0432\u0441\u0451 \u043f\u043b\u043e\u0445\u043e.<\/span><\/p>\n<h3>AutoMapper<\/h3>\n<p>\u0421\u0430\u043c \u044f <em>AutoMapper<\/em> \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b. \u041d\u043e \u043f\u043e\u0447\u0442\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043a\u0443\u0434\u0430 \u044f \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b, \u043e\u043d \u0443\u0436\u0435 \u0431\u044b\u043b. \u041e\u0431\u044b\u0447\u043d\u043e \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435 \u0441 Clean Architecture, MediatR \u0438 \u0442\u043e\u0439 \u0441\u0430\u043c\u043e\u0439 \u043f\u0430\u043f\u043a\u043e\u0439 <code>Mappings<\/code>.<\/p>\n<pre><code class=\"cs\">public class UserProfile : Profile{    public UserProfile()    {        CreateMap&lt;User, UserResponse&gt;();        CreateMap&lt;UpdateUserRequest, User&gt;();    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435\u0432\u0438\u043d\u043d\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e \u043f\u0443\u043d\u043a\u0442\u0430\u043c.<\/p>\n<p><strong>1. \u041e\u0448\u0438\u0431\u043a\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435.<\/strong> \u0417\u0430\u0431\u044b\u043b\u0438 <code>CreateMap<\/code> &#8212; \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u0438\u0437 <code>AutoMapperMappingException: Missing type map configuration or unsupported mapping<\/code> \u0432 \u043b\u043e\u0433\u0430\u0445. \u041f\u043e\u043b\u0435 \u0432 \u0446\u0435\u043b\u0438 \u043d\u0435 \u043d\u0430\u0448\u043b\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a &#8212; \u043d\u0435 \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u0432\u043e\u043e\u0431\u0449\u0435, \u043e\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f <code>default<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c <code>AssertConfigurationIsValid()<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0430\u0434\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0432 \u0442\u0435\u0441\u0442\u0430\u0445. \u0423\u0433\u0430\u0434\u0430\u0439\u0442\u0435, \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u043e \u043d\u0435\u0451 \u0437\u0430\u0431\u044b\u0432\u0430\u044e\u0442.<\/p>\n<p><strong>2. \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043b\u043e\u043c\u0430\u0435\u0442 \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u043c\u043e\u043b\u0447\u0430.<\/strong> \u041c\u0430\u043f\u043f\u0438\u043d\u0433 \u043f\u043e \u043a\u043e\u043d\u0432\u0435\u043d\u0446\u0438\u0438 &#8212; \u044d\u0442\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a. \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043b\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u043e\u043c \u0432 IDE &#8212; \u0441\u0442\u0443\u0434\u0438\u044f \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432\u0441\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f, \u0430 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b. Find Usages \u043f\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443 DTO \u043d\u0435 \u043f\u043e\u043a\u0430\u0436\u0435\u0442, \u043e\u0442\u043a\u0443\u0434\u0430 \u043e\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f. F12 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0432\u0435\u0434\u0451\u0442.<\/p>\n<p><strong>3. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f &#8212; \u044d\u0442\u043e \u043a\u043e\u0434, \u0442\u043e\u043b\u044c\u043a\u043e \u0445\u0443\u0436\u0435.<\/strong> \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0432\u0435\u043d\u0446\u0438\u0438 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442, \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f <code>ForMember<\/code>, <code>MapFrom<\/code>, <code>ConvertUsing<\/code>, <code>IValueResolver<\/code>, <code>AfterMap<\/code>. \u0420\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437 DI, \u0432 <code>MapFrom<\/code> \u0443\u0435\u0437\u0436\u0430\u044e\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u0438 \u0447\u0435\u0440\u0435\u0437 \u0433\u043e\u0434 \u0432 \u043f\u0440\u043e\u0444\u0438\u043b\u044f\u0445 \u0436\u0438\u0432\u0451\u0442 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0432\u0438\u0434\u0438\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u043e\u0444\u0438\u043b\u0438 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u0432\u0437\u044f\u043b\u043e\u0441\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u0430\u0434\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u0440\u043e\u0444\u0438\u043b\u044c, \u0432 \u043f\u0440\u043e\u0444\u0438\u043b\u0435 &#8212; <code>ForMember<\/code>, \u0432 \u043d\u0451\u043c &#8212; \u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440, \u0432 \u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u0435 &#8212; \u0441\u0435\u0440\u0432\u0438\u0441.<\/p>\n<p><strong>4. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435 \u043f\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e.<\/strong> \u0410\u0432\u0442\u043e\u0440 <em>AutoMapper<\/em> \u0441\u0430\u043c <a href=\"https:\/\/www.jimmybogard.com\/automappers-design-philosophy\/\" rel=\"noopener nofollow\">\u043f\u0438\u0441\u0430\u043b<\/a>, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u043f\u043e\u0434 \u043e\u0434\u0438\u043d \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439: \u0446\u0435\u043b\u044c &#8212; \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u043f\u043b\u044e\u0449\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e view model. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u0440\u0443\u0433\u0430\u044f, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0432\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u0410 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0447\u0435\u0440\u0435\u0437 <em>AutoMapper<\/em> \u043c\u0430\u043f\u043f\u044f\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443.<\/p>\n<p><strong>5. <\/strong><code><strong>IMapper<\/strong><\/code><strong> \u0432\u0435\u0437\u0434\u0435.<\/strong> \u0414\u043b\u044f <code>Map<\/code> \u043d\u0443\u0436\u0435\u043d <code>IMapper<\/code>, \u0434\u043b\u044f <code>ProjectTo<\/code> &#8212; <code>IConfigurationProvider<\/code>. \u0417\u043d\u0430\u0447\u0438\u0442, <code>AddAutoMapper<\/code> \u0432 DI, \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0431\u043e\u0440\u043e\u043a \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0438 <code>IMapper<\/code> \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u0430. \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u043d\u0435\u0434\u0440\u044f\u044e\u0442 \u0440\u0430\u0434\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043b\u043e\u0436\u0438\u0442\u044c \u043f\u043e\u043b\u044f \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<p><strong>6. <\/strong><code><strong>required<\/strong><\/code><strong> \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/strong>, \u0441\u043c. \u0432\u044b\u0448\u0435.<\/p>\n<p><strong>7. \u041c\u0435\u0434\u043b\u0435\u043d\u043d\u043e.<\/strong> AutoMapper \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 8 \u0440\u0430\u0437. \u0426\u0438\u0444\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u043d\u0438\u0436\u0435.<\/p>\n<p><strong>\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f.<\/strong> \u0421 15-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 (\u0438\u044e\u043b\u044c 2025) AutoMapper \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0439 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043e\u0434 MIT &#8212; 14-\u044f. \u041a \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c, \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u0435\u0449\u0451 \u0438 \u044e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0430\u044f.<\/p>\n<p>\u042d\u0442\u043e \u0437\u0430\u043a\u043e\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u0430. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u0442\u044c, \u0442\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0437\u0430\u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u0442\u044c \u043d\u0430 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d AutoMapper.<\/p>\n<h3>Mapperly<\/h3>\n<p><em>Mapperly<\/em> &#8212; \u043b\u0443\u0447\u0448\u0438\u0439 \u0438\u0437 \u0442\u0440\u0451\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043e\u0431\u0438\u0434\u043d\u044b. Source generator, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 C#, \u043d\u043e\u043b\u044c \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438. \u041d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0447\u043b\u0435\u043d\u044b \u0446\u0435\u043b\u0438 \u043b\u043e\u0432\u0438\u0442 (RMG012), <code>required<\/code> \u0443\u0432\u0430\u0436\u0430\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 object initializer, \u0438 \u044f\u0437\u044b\u043a \u0441\u0430\u043c \u0432\u044b\u0434\u0430\u0441\u0442 CS9035.<\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0446\u0435\u043d\u0430:<\/p>\n<pre><code>[Mapper]public static partial class UserMapper{    public static partial UserResponse ToResponse(User user);    public static partial void UpdateUser(UpdateUserRequest request, User user);    public static partial IQueryable&lt;UserResponse&gt; ProjectToResponse(this IQueryable&lt;User&gt; q);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>1. \u041c\u0430\u043f\u043f\u0435\u0440 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u0430\u0440\u0443.<\/strong> \u0422\u0440\u0438\u0434\u0446\u0430\u0442\u044c DTO &#8212; \u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044c partial-\u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u041f\u043b\u044e\u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e. \u041f\u043b\u044e\u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442. \u0420\u0443\u0447\u043d\u043e\u0439 \u043c\u0430\u043f\u043f\u0438\u043d\u0433, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f, \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0441\u044f \u0432 \u0440\u0443\u0447\u043d\u043e\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430. \u0421\u0442\u0440\u043e\u043a \u043c\u0435\u043d\u044c\u0448\u0435, \u0446\u0435\u0440\u0435\u043c\u043e\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435.<\/p>\n<p><strong>2. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u0430 \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b.<\/strong> \u041d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 &#8212; \u044d\u0442\u043e <code>[MapProperty(nameof(User.FirstName), nameof(UserResponse.Name))]<\/code> \u0438\u043b\u0438 <code>[MapperIgnoreTarget(...)]<\/code>. \u0422\u0435 \u0436\u0435 <code>ForMember<\/code> \u0438\u0437 <em>AutoMapper<\/em>, \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u043a\u043e\u0431\u043a\u0430\u0445.<\/p>\n<p><strong>3. \u0412\u044b\u0437\u043e\u0432 \u043d\u0435 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435.<\/strong> \u0425\u043e\u0447\u0435\u0448\u044c \u043c\u0430\u043f\u043f\u0438\u043d\u0433 &#8212; \u043d\u0430\u0439\u0434\u0438, \u0432 \u043a\u0430\u043a\u043e\u043c \u043c\u0430\u043f\u043f\u0435\u0440\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434. \u041d\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e &#8212; \u0438\u0434\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0439. \u041c\u0430\u043f\u043f\u0435\u0440 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0435\u0449\u0451 \u043e\u0434\u043d\u0438\u043c \u0441\u043b\u043e\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c. \u041a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e, \u0447\u0435\u0433\u043e \u043c\u043d\u0435 \u0432 Clean Architecture \u0438 \u0442\u0430\u043a \u0445\u0432\u0430\u0442\u0430\u0435\u0442.<\/p>\n<p><strong>4. Generic-\u043a\u043e\u0434 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/strong> Mapperly \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0430\u0440 \u0442\u0438\u043f\u043e\u0432, \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 generic-\u043c\u0435\u0442\u043e\u0434\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u0431\u0430\u0437\u043e\u0432\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438\u043b\u0438 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u043c \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u0435, \u0442\u0438\u043f\u043e\u0432 \u0442\u0430\u043c \u043d\u0435\u0442, \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e <code>TEntity<\/code> \u0438 <code>TDto<\/code>:<\/p>\n<pre><code class=\"cs\">public Task&lt;List&lt;TDto&gt;&gt; GetAll&lt;TEntity, TDto&gt;() where TEntity : class{    IQueryable&lt;TEntity&gt; query = db.Set&lt;TEntity&gt;();    IQueryable&lt;TDto&gt; projected = ???; \/\/ \u043a\u0430\u043a\u043e\u0439 partial-\u043c\u0435\u0442\u043e\u0434 \u043c\u0430\u043f\u043f\u0435\u0440\u0430 \u0441\u044e\u0434\u0430 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c?    return projected.ToListAsync();}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0443\u0436\u0435\u043d \u0440\u0430\u043d\u0442\u0430\u0439\u043c-\u0444\u043e\u043b\u043b\u0431\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442 \u043c\u0430\u043f\u043f\u0438\u043d\u0433, \u043a\u043e\u0433\u0434\u0430 \u0442\u0438\u043f\u044b \u0441\u0442\u0430\u043d\u0443\u0442 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b. \u0412 Mapperly \u0435\u0433\u043e \u043d\u0435\u0442: generic-\u043c\u0435\u0442\u043e\u0434\u044b \u043c\u0430\u043f\u043f\u0435\u0440\u0430 \u0443\u043c\u0435\u044e\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043f\u0430\u0440, \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0432 \u0442\u043e\u043c \u0436\u0435 \u043c\u0430\u043f\u043f\u0435\u0440\u0435.<\/p>\n<h4>Mapster<\/h4>\n<p><em>Mapster<\/em> &#8212; \u044d\u0442\u043e <em>AutoMapper<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0448\u0438\u043b \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u0439. \u041f\u0440\u043e\u0449\u0435 \u043d\u0430 \u0432\u0445\u043e\u0434\u0435, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u043d\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c.<\/p>\n<pre><code class=\"cs\">var dto = user.Adapt&lt;UserResponse&gt;();                                    \/\/ \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442request.Adapt(user);                                                     \/\/ \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442var list = await db.Users.ProjectToType&lt;UserResponse&gt;().ToListAsync(ct); \/\/ \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code>TypeAdapterConfig&lt;User, UserResponse&gt;    .NewConfig()    .Map(d =&gt; d.FullName, s =&gt; s.FirstName + \" \" + s.LastName);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>1. <\/strong><code><strong>Adapt<\/strong><\/code><strong> \u0432\u0438\u0441\u0438\u0442 \u043d\u0430 <\/strong><code><strong>object<\/strong><\/code><strong>.<\/strong> \u041c\u0435\u0442\u043e\u0434 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u043a\u0430\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f <code>object<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 IntelliSense \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0435\u0433\u043e \u043d\u0430 \u0432\u0441\u0451\u043c \u043f\u043e\u0434\u0440\u044f\u0434. <code>42.Adapt&lt;UserResponse&gt;()<\/code> \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0422\u0438\u043f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0435\u0447\u0435\u0433\u043e.<\/p>\n<p><strong>2. \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.<\/strong> \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0436\u0438\u0432\u0451\u0442 \u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c <code>TypeAdapterConfig.GlobalSettings<\/code>. \u041b\u044e\u0431\u043e\u0439 \u043a\u043e\u0434 \u0432 \u043b\u044e\u0431\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u0435\u0451 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c, \u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 &#8212; \u0432\u0430\u0448\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.<\/p>\n<p><strong>3. \u041e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435.<\/strong> \u041c\u0430\u043f\u043f\u0438\u043d\u0433 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u0447\u0442\u043e \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0446\u0435\u043b\u0438 \u0435\u0441\u0442\u044c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a, \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c: <code>RequireDestinationMemberSource = true<\/code> \u043f\u043b\u044e\u0441 \u0432\u044b\u0437\u043e\u0432 <code>Compile()<\/code> \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u043d\u0430 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0430. \u0418 \u0434\u0430\u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u0430\u044f, \u043e\u043d\u0430 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u043d\u0435 \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435.<\/p>\n<p><strong>4. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u0431\u043e\u043a\u0443.<\/strong> \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u0443 Mapster \u0435\u0441\u0442\u044c, \u043d\u043e \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 Mapster.Tool. \u0415\u0433\u043e \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a dotnet tool \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438:<\/p>\n<pre><code class=\"xml\">&lt;Target Name=\"Mapster\" AfterTargets=\"AfterBuild\"&gt;  &lt;Exec WorkingDirectory=\"$(ProjectDir)\" Command=\"dotnet tool restore\" \/&gt;  &lt;Exec WorkingDirectory=\"$(ProjectDir)\"        Command=\"dotnet mapster extension -a &amp;quot;$(TargetDir)$(ProjectName).dll&amp;quot;\" \/&gt;&lt;\/Target&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0447\u0438\u0442\u0430\u0435\u0442 \u0443\u0436\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u0443\u044e DLL \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0439\u043b\u044b \u0441 \u043c\u0430\u043f\u043f\u0435\u0440\u0430\u043c\u0438 \u043f\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c \u0438\u043b\u0438 fluent-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438:<\/p>\n<pre><code class=\"cs\">[AdaptTo(\"[name]Dto\"), GenerateMapper]public class User { ... }\/\/ \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441 UserDto \u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 UserMapper:var dto = user.AdaptToDto();user.AdaptTo(existingDto);var list = db.Users.Select(UserMapper.ProjectToDto);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e \u0442\u0443\u0442 \u043d\u0435 \u0442\u0430\u043a:<\/p>\n<ul>\n<li>\n<p>\u044d\u0442\u043e \u043d\u0435 Roslyn source generator, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 IDE \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438, \u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0433 \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0434\u0451\u0442 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0432\u0435\u0436\u0438\u0439 \u043c\u0430\u043f\u043f\u0435\u0440 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u0441\u0431\u043e\u0440\u043a\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0431\u0438\u043b\u0434\u0435<\/p>\n<\/li>\n<li>\n<p>\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u043d\u0430 CI \u0438 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043d\u043e\u0432\u043e\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443<\/p>\n<\/li>\n<li>\n<p>API \u0443 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0434\u0440\u0443\u0433\u043e\u0439, \u043d\u0435 <code>Adapt&lt;T&gt;()<\/code>: \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0441 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430 \u043d\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e &#8212; \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u044b\u0437\u043e\u0432\u044b<\/p>\n<\/li>\n<li>\n<p>\u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a \u0432 \u043c\u0435\u0441\u0442\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043d\u0435\u0442<\/p>\n<\/li>\n<\/ul>\n<h3>\u0421\u0432\u043e\u0434\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041d\u0443\u0436\u043d\u043e<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041a\u0442\u043e \u0434\u0430\u0451\u0442<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0412\u044b\u0437\u043e\u0432 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435, \u0431\u0435\u0437 \u043a\u043b\u0430\u0441\u0441\u043e\u0432-\u043c\u0430\u043f\u043f\u0435\u0440\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">Mapster, AutoMapper<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0411\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0439 \u0432 DI<\/p>\n<\/td>\n<td>\n<p align=\"left\">Mapster, Mapperly<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0435 \u0446\u0435\u043b\u0438 \u043d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">Mapperly (\u0446\u0435\u043d\u043e\u0439 \u0432\u0445\u043e\u0434\u0430)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u0440\u043e\u0435\u043a\u0446\u0438\u044f <code>IQueryable<\/code> \u0432 SQL<\/p>\n<\/td>\n<td>\n<p align=\"left\">AutoMapper, Mapster, Mapperly<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0420\u0430\u0431\u043e\u0442\u0430 \u0432 generic-\u043a\u043e\u0434\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">AutoMapper, Mapster (\u0440\u0430\u043d\u0442\u0430\u0439\u043c)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>required<\/code> \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">Mapperly<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0412\u0441\u0451 \u0441\u0440\u0430\u0437\u0443, \u0431\u0435\u0437 \u0446\u0435\u0440\u0435\u043c\u043e\u043d\u0438\u0439<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0438\u043a\u0442\u043e<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043d\u0430 \u0440\u044b\u043d\u043a\u0435 \u043f\u0443\u0441\u0442\u043e, \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0434\u0432\u0430: \u0441\u043c\u0438\u0440\u0438\u0442\u044c\u0441\u044f \u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0451. \u042f \u0432\u044b\u0431\u0440\u0430\u043b \u0432\u0442\u043e\u0440\u043e\u0435.<\/p>\n<h2>\u041a\u0430\u043a \u044f \u0445\u043e\u0447\u0443<\/h2>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0445\u043e\u0442\u0435\u043b \u0442\u0430\u043a\u043e\u0439 API:<\/p>\n<pre><code class=\"cs\">var dto = user.MapTo&lt;UserResponse&gt;();            \/\/ \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442request.MapTo(user);                             \/\/ \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442var list = db.Users.ProjectTo&lt;UserResponse&gt;();   \/\/ \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u0432 SQL<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u0440\u0430\u043d\u0442\u0430\u0439\u043c-\u0432\u0435\u0440\u0441\u0438\u0438 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442: \u043c\u0435\u0442\u043e\u0434 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a <code>MapTo&lt;TTarget&gt;(this object source)<\/code>, \u0430 \u0442\u0438\u043f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <code>source.GetType()<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0442\u0430\u043a \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0443 \u043d\u0443\u0436\u0435\u043d \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0438\u043f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u0437\u043d\u0430\u0447\u0438\u0442, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435: <code>MapTo&lt;TSource, TTarget&gt;(this TSource source)<\/code>. \u0410 C# \u0432\u044b\u0432\u043e\u0434\u0438\u0442 generic-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043b\u0438\u0431\u043e \u0432\u0441\u0435, \u043b\u0438\u0431\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0435. \u0423\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e <code>TTarget<\/code> \u043d\u0435\u043b\u044c\u0437\u044f, \u0438 \u0432\u044b\u0437\u043e\u0432 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code class=\"cs\">var dto = user.MapTo&lt;User, UserResponse&gt;();var list = db.Users.ProjectTo&lt;User, UserResponse&gt;();<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u043e, \u0438 \u0442\u0438\u043f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435. \u0414\u043b\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435\u0442: \u043e\u0431\u0430 \u0442\u0438\u043f\u0430 \u0432\u044b\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0438\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u041d\u043e \u0440\u0430\u0434\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 API \u043d\u0435 \u0434\u0435\u043b\u0430\u044e\u0442.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0437\u043e\u0432 \u0440\u0430\u0437\u0431\u0438\u0442 \u043d\u0430 \u0434\u0432\u0430 \u0448\u0430\u0433\u0430. \u041c\u0435\u0442\u043e\u0434 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443-\u043e\u0431\u0451\u0440\u0442\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0442\u0438\u043f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u0430 \u0443 \u043e\u0431\u0451\u0440\u0442\u043a\u0438 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c <code>To&lt;TTarget&gt;()<\/code>, \u0433\u0434\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0446\u0435\u043b\u044c:<\/p>\n<pre><code class=\"cs\">public readonly struct FusionSource&lt;TSource&gt;(TSource value){    public TTarget To&lt;TTarget&gt;() =&gt; FusionMapper&lt;TSource, TTarget&gt;.Map(value);    public TTarget To&lt;TTarget&gt;(TTarget target) =&gt; FusionMapper&lt;TSource, TTarget&gt;.Map(value, target);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0451\u0440\u0442\u043a\u0430 &#8212; \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u043b\u0438\u0448\u043d\u0438\u0445 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u043d\u0435\u0442. \u0412 \u0438\u0442\u043e\u0433\u0435 API \u0442\u0430\u043a\u043e\u0439:<\/p>\n<pre><code class=\"cs\">var dto = user.Map().To&lt;UserResponse&gt;();            \/\/ \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442request.Map().To(user);                             \/\/ \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442var list = db.Users.Project().To&lt;UserResponse&gt;();   \/\/ \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u0432 SQL<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u0439, \u043a\u043b\u0430\u0441\u0441\u043e\u0432-\u043c\u0430\u043f\u043f\u0435\u0440\u043e\u0432 \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0439 \u0432 DI. \u0415\u0441\u043b\u0438 \u0443 \u043f\u043e\u043b\u044f \u0446\u0435\u043b\u0438 \u043d\u0435\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 &#8212; \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u0432 \u043c\u0435\u0441\u0442\u0435 \u0432\u044b\u0437\u043e\u0432\u0430. \u0415\u0441\u043b\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043d\u0435\u0442 \u0443 <code>required<\/code>-\u043f\u043e\u043b\u044f &#8212; \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <em>FusionMapper<\/em>: \u0441\u043b\u0438\u044f\u043d\u0438\u0435 \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u0438 source-generated \u043c\u0430\u043f\u0435\u0440\u0430. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0418\u0418, \u044f \u0445\u043e\u0442\u0435\u043b \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0435\u0433\u043e <em>SlopMapper<\/em>.<\/p>\n<h2>\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f<\/h2>\n<p>\u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u043b \u0438 \u0441 \u0447\u0435\u043c \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f<\/p>\n<h3>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u043d\u0442\u0430\u0439\u043c<\/h3>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 &#8212; 5 \u0430\u0432\u0433\u0443\u0441\u0442\u0430. \u041d\u0430\u0447\u0430\u043b \u044f \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0430 \u0441 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u043d\u0430 expression trees.<\/p>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0434\u043e\u043b\u0433\u043e \u0438\u0442\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0410 \u043a\u043e\u043d\u0432\u0435\u043d\u0446\u0438\u0438 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u043c \u044f\u0434\u0440\u0435: \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043f\u0440\u043e\u0433\u043d\u0430\u043b \u0442\u0435\u0441\u0442\u044b.<\/p>\n<p>\u0420\u0430\u043d\u0442\u0430\u0439\u043c-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0438 \u0442\u0435\u0441\u0442\u044b \u043a \u043d\u0435\u043c\u0443 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043b <em>Qwen<\/em>. \u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439, \u043f\u0440\u044f\u043c\u043e \u0432 \u0447\u0430\u0442\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435, \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u0438\u0445 IDE-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439. \u042f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u043a\u043e\u0434 \u0438 \u0442\u0435\u0441\u0442\u044b, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b \u043e\u0448\u0438\u0431\u043a\u0438. \u0421\u0430\u043c \u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043b. \u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u043d\u0438 \u0443\u0448\u043b\u0438 \u043d\u0430 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443:<\/p>\n<ul>\n<li>\n<p>\u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u043f\u043e \u0438\u043c\u0435\u043d\u0438: \u0442\u043e\u0447\u043d\u043e\u0435, \u0431\u0435\u0437 \u0443\u0447\u0451\u0442\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430, \u0431\u0435\u0437 \u0432\u0435\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u044f; \u043f\u043e\u043b\u044f \u043d\u0430\u0440\u0430\u0432\u043d\u0435 \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438<\/p>\n<\/li>\n<li>\n<p>\u0444\u043b\u044d\u0442\u0442\u0435\u043d\u0438\u043d\u0433: <code>CustomerAddressCity<\/code> \u2190 <code>Customer.Address.City<\/code>, \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u0433\u043b\u0443\u0431\u0438\u043d\u0443<\/p>\n<\/li>\n<li>\n<p>nullable reference types: \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0447\u0435\u0440\u0435\u0437 nullable-\u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0430\u0451\u0442 <code>null<\/code>, \u0430 \u043d\u0435 <code>NullReferenceException<\/code>; nullable-\u0441\u0442\u0440\u043e\u043a\u0430 \u0432 non-nullable \u043f\u043e\u043b\u0435 &#8212; \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b, <code>required<\/code> \u0438 <code>init<\/code>: \u0432\u044b\u0431\u043e\u0440 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0441 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u043e \u0438\u043c\u0435\u043d\u0438, <code>[SetsRequiredMembers]<\/code> \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f<\/p>\n<\/li>\n<li>\n<p>\u0430\u0433\u0440\u0435\u0433\u0430\u0442\u044b &#8212; \u043f\u0440\u043e \u043d\u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e<\/p>\n<\/li>\n<\/ul>\n<p>\u041a 12 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 \u0431\u044b\u043b\u0438 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438, \u0438 \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u043e\u0431\u0433\u043e\u043d\u044f\u043b\u0430 Mapster. \u041d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043e\u043d\u0430 \u043d\u0435 \u0434\u0430\u0432\u0430\u043b\u0430: \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u0441\u0451 \u0435\u0449\u0451 \u043f\u043e\u044f\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438, \u0430 IDE \u043c\u043e\u043b\u0447\u0430\u043b\u0430 \u0434\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n<h3>\u0410\u0433\u0440\u0435\u0433\u0430\u0442\u044b<\/h3>\n<p>\u041f\u043e\u0447\u0442\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 view-\u043c\u043e\u0434\u0435\u043b\u0438 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0434\u043a\u0430 \u043f\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c \u0437\u0430\u043a\u0430\u0437\u0430, \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u00ab\u0435\u0441\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\u00bb, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u043e\u043a\u0443\u043f\u0430\u0442\u0435\u043b\u044c.<\/p>\n<p>\u041c\u043d\u0435 \u0431\u044b\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0435\u0448\u0430\u044e\u0442 \u0434\u0440\u0443\u0433\u0438\u0435. \u0423 <em>AutoMapper<\/em> \u043f\u043e \u043a\u043e\u043d\u0432\u0435\u043d\u0446\u0438\u0438 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u0430\u0433\u0440\u0435\u0433\u0430\u0442 &#8212; <code>Count<\/code>. \u0418 \u0442\u043e\u0442 \u043d\u0435 \u0444\u0438\u0447\u0430, \u0430 \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0444\u043b\u044d\u0442\u0442\u0435\u043d\u0438\u043d\u0433\u0430: \u0438\u043c\u044f <code>LinesCount<\/code> \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 <code>Lines<\/code> + <code>Count<\/code>, \u0430 <code>Count<\/code> &#8212; \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>List&lt;T&gt;<\/code>. \u0421\u0442\u043e\u0438\u0442 \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u043a\u0430\u043a <code>IEnumerable&lt;T&gt;<\/code>, \u0438 \u0432\u0441\u0451 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u042f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b \u043d\u0430 AutoMapper 15: <code>LinesCount<\/code> \u043c\u0430\u043f\u043f\u0438\u0442\u0441\u044f \u0431\u0435\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, <code>LinesAmountSum<\/code> \u043c\u043e\u043b\u0447\u0430 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0443\u043b\u0451\u043c. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0440\u0443\u043a\u0430\u043c\u0438:<\/p>\n<pre><code class=\"cs\">CreateMap&lt;Order, OrderDto&gt;()    .ForMember(d =&gt; d.Total, o =&gt; o.MapFrom(s =&gt; s.Lines.Sum(l =&gt; l.Amount)))    .ForMember(d =&gt; d.HasActive, o =&gt; o.MapFrom(s =&gt; s.Lines.Any(l =&gt; l.IsActive)));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 FusionMapper \u0430\u0433\u0440\u0435\u0433\u0430\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u0435\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0418\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 DTO<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>LinesCount<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>Lines.Count<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>LinesAmountSum<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>Lines.Sum(x =&gt; x.Amount)<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>LinesAmountAverage<\/code>, <code>...Max<\/code>, <code>...Min<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0430\u0433\u0440\u0435\u0433\u0430\u0442 \u043f\u043e \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u0443<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>LinesIsActiveAny<\/code>, <code>LinesIsActiveAll<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>Lines.Any\/All(x =&gt; x.IsActive)<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>LinesBuyerLastOrDefault<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>Lines.Select(x =&gt; x.Buyer).LastOrDefault()<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0412\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d\u043d\u0430\u0434\u0446\u0430\u0442\u044c \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0432. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u0442, \u0438 \u0432 <code>Project().To&lt;&gt;()<\/code> \u044d\u0442\u043e \u0443\u0435\u0437\u0436\u0430\u0435\u0442 \u0432 SQL.<\/p>\n<p>\u0414\u0432\u0435 \u0447\u0435\u0441\u0442\u043d\u044b\u0435 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>\u0438\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 &#8212; \u044d\u0442\u043e magic string, \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0443 \u0432 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u0435 \u043f\u043e\u0439\u043c\u0430\u0435\u0442 \u043d\u0435 \u043e\u0448\u0438\u0431\u043a\u0430, \u0430 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 <code>FMAP005<\/code><\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u0443\u0441\u0442\u044b\u0445 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u0445 \u043a\u0430\u043a \u0432 LINQ: <code>Average<\/code>, <code>Max<\/code>, <code>First<\/code> \u0431\u0440\u043e\u0441\u044f\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0435\u0441\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b <code>*OrDefault<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u0434\u0430, \u0435\u0441\u043b\u0438 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e <code>Total<\/code>, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0443\u0441\u0442\u0443\u043f\u0438\u0442\u044c. \u0410\u043d\u0430\u043b\u043e\u0433\u0430 <code>ForMember<\/code> \u043d\u0435\u0442.<\/p>\n<h3>Source generator<\/h3>\n<p>\u0417\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0443 source generator \u0441 \u0438\u043d\u0442\u0435\u0440\u0441\u0435\u043f\u0442\u043e\u0440\u0430\u043c\u0438 \u044f \u0432\u0437\u044f\u043b \u0443 Andrew Lock &#8212; <a href=\"https:\/\/andrewlock.net\/creating-a-source-generator-part-1-creating-an-incremental-source-generator\/\" rel=\"noopener nofollow\">\u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443<\/a>. \u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b <em>Qwen<\/em> \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u043d\u0442\u0430\u0439\u043c-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0432 source generator \u043f\u043e\u0432\u0435\u0440\u0445 \u044d\u0442\u043e\u0439 \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0438. \u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u0430 \u043f\u043e\u0447\u0442\u0438 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0445\u043e\u0434: \u0432\u043c\u0435\u0441\u0442\u043e <code>Expression<\/code> &#8212; \u0441\u0442\u0440\u043e\u043a\u0438 C#.<\/p>\n<h4>\u0418\u043d\u0442\u0435\u0440\u0441\u0435\u043f\u0442\u043e\u0440\u044b<\/h4>\n<p>\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u0445\u043e\u0442\u0435\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, &#8212; C# Interceptors. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441\u0432\u043e\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0438\u0448\u0435\u0442:<\/p>\n<pre><code class=\"cs\">var dto = user.Map().To&lt;UserDto&gt;();<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"cs\">public static UserDto Map__User__To__UserDto(User source){    if (source == null) return default;    return new UserDto    {        Name = source.Name,        Age = source.Age    };}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0431\u044b\u0447\u043d\u044b\u0439 object initializer, \u043d\u043e\u043b\u044c \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438. \u0418 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0439 \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0430 \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0432 \u043f\u0440\u043e\u0434\u0435.<\/p>\n<p>\u0417\u0432\u0443\u0447\u0438\u0442 \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0430. \u0415\u0441\u043b\u0438 \u043d\u0430\u043a\u043e\u0441\u044f\u0447\u0438\u0441 \u0441 \u0438\u043d\u0442\u0435\u0440\u0441\u0435\u043f\u0442\u043e\u0440\u0430\u043c\u0438, \u0442\u043e \u043a\u043e\u0434 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0438 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0437\u043d\u0430\u0435\u0448\u044c \u0432\u044b\u0437\u0432\u0430\u043b\u0441\u044f \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0438\u043b\u0438 \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u0444\u043e\u043b\u043b\u0431\u0435\u043a. \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0442\u0435\u0441\u0442 \u0432 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0443\u043f\u0430\u0434\u0435\u0442 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043d\u043e \u043f\u043e \u0441\u0442\u0435\u043a\u0442\u0440\u0435\u0439\u0441\u0443.<\/p>\n<p>\u0415\u0441\u0442\u044c \u0438 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u043f\u043e\u0442\u0435\u0440\u044f\u043b \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0412\u043d\u0443\u0442\u0440\u0438 expression tree \u0438\u043d\u0442\u0435\u0440\u0441\u0435\u043f\u0442\u043e\u0440 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f: \u0442\u0430\u043c \u043d\u0435\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430, \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u043d\u043d\u044b\u0435, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0432\u044b\u0437\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0441\u0442\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 \u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u0435, \u0447\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043b\u044f\u043c\u0431\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 <code>Expression&lt;...&gt;<\/code>.<\/p>\n<p>\u041f\u0435\u0440\u0432\u0443\u044e \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0438\u043d\u0442\u0435\u0440\u0441\u0435\u043f\u0442\u043e\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u043b\u0438 \u0432\u0441\u0435 \u0432\u044b\u0437\u043e\u0432\u044b <code>.To&lt;T&gt;()<\/code>, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b Qwen. \u042d\u0442\u043e\u0442 \u0444\u0438\u043b\u044c\u0442\u0440 \u0432 \u043d\u0435\u0439 \u0431\u044b\u043b. \u0410 \u043f\u043e\u0442\u043e\u043c \u044f \u043f\u0440\u0438 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0435\u0433\u043e \u0441\u043b\u043e\u043c\u0430\u043b. \u0418\u043d\u0442\u0435\u0440\u0441\u0435\u043f\u0442\u043e\u0440\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043a \u0432\u044b\u0437\u043e\u0432\u0430\u043c \u0432\u043d\u0443\u0442\u0440\u0438 expression, \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0442\u0430\u043b \u043f\u0430\u0434\u0430\u0442\u044c. \u041d\u0435 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0432 \u043a\u043e\u0434\u0435, \u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0431\u0435\u0437 \u0432\u043d\u044f\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u0431\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043d \u0443\u043f\u0430\u043b.<\/p>\n<p>\u041e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u043b \u044f \u044d\u0442\u043e \u0434\u043e\u043b\u0433\u043e. \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0437\u0430 15-16 \u0430\u0432\u0433\u0443\u0441\u0442\u0430:<\/p>\n<pre><code>Added interceptors for To method callsRefactoring? temporary disabled generators\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0438\u043d\u0442\u0435\u0440\u0441\u0435\u043f\u0442\u043e\u0440\u044b<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043f\u043e\u0447\u0438\u043d\u0438\u043b, \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0437 \u0437\u0430 \u0432\u0441\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u0414\u0443\u043c\u0430\u044e, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0438\u0437\u043b\u0438\u0448\u043d\u0438.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0434\u0432\u0435 \u0441\u0445\u0435\u043c\u044b:<\/p>\n<ul>\n<li>\n<p>.NET 9+ &#8212; \u0438\u043d\u0442\u0435\u0440\u0441\u0435\u043f\u0442\u043e\u0440\u044b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438 \u043d\u0435\u0442, \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0439 \u043c\u0430\u043f\u043f\u0438\u043d\u0433 &#8212; \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>.NET 8 \u0438\u043b\u0438 <code>EnableFusionMapperInterceptor=false<\/code> &#8212; \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0430\u043f\u043f\u0435\u0440\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 <code>[ModuleInitializer]<\/code>, \u0442\u043e, \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043d\u0435 \u0441\u043c\u043e\u0433 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c, \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435, \u0430 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\u043c<\/p>\n<\/li>\n<\/ul>\n<p>\u0420\u0430\u043d\u0442\u0430\u0439\u043c-\u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0434\u0435\u043b\u0430\u0441\u044c, \u0438 \u044d\u0442\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 generic-\u043a\u043e\u0434\u0430. \u0415\u0441\u043b\u0438 \u0432\u044b\u0437\u043e\u0432 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 generic-\u043c\u0435\u0442\u043e\u0434\u0430 \u0438 \u0442\u0438\u043f\u044b \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0435\u0433\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442, \u0438 \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438:<\/p>\n<pre><code class=\"cs\">public Task&lt;List&lt;TDto&gt;&gt; GetAll&lt;TEntity, TDto&gt;() where TEntity : class    =&gt; db.Set&lt;TEntity&gt;().Project().To&lt;TDto&gt;().ToListAsync();<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0430\u043c, \u0433\u0434\u0435 \u0442\u0438\u043f\u044b \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434. \u0422\u0430\u043c, \u0433\u0434\u0435 \u043d\u0435\u0442, &#8212; \u0440\u0430\u043d\u0442\u0430\u0439\u043c-\u0444\u043e\u043b\u043b\u0431\u0435\u043a. \u0412\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439.<\/p>\n<h4>\u041f\u0440\u043e\u0435\u043a\u0446\u0438\u0438<\/h4>\n<p>\u0414\u043b\u044f <code>Project().To&lt;T&gt;()<\/code> \u043d\u0443\u0436\u0435\u043d \u043d\u0435 \u043a\u043e\u0434, \u0430 \u0434\u0430\u043d\u043d\u044b\u0435 &#8212; <code>Expression&lt;Func&lt;TSource, TTarget&gt;&gt;<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 EF Core \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442 \u0432 SQL. \u0418\u043d\u0442\u0435\u0440\u0441\u0435\u043f\u0442\u043e\u0440\u044b \u0442\u0443\u0442 \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0442 \u0436\u0435 <code>[ModuleInitializer]<\/code> \u043a\u043b\u0430\u0434\u0451\u0442 \u0438\u0445 \u0432 \u043a\u044d\u0448 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0441\u0431\u043e\u0440\u043a\u0438. \u0412 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043d\u0435 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f.<\/p>\n<h4>\u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0435<\/h4>\n<p>\u0422\u043e, \u0447\u0442\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b <em>Qwen<\/em>, \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e. <em>Roslyn<\/em> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u0438 \u0435\u0441\u043b\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0438, \u0441\u0442\u0443\u0434\u0438\u044f \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0441\u043e\u043b\u044e\u0448\u0435\u043d\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442\u044c.<\/p>\n<p>Incremental generator \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0448\u0430\u0433\u043e\u0432 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u0435\u0436\u0434\u0443 \u0448\u0430\u0433\u0430\u043c\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e. \u041c\u0430\u0441\u0441\u0438\u0432\u044b \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u043d\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f, \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u044b Roslyn \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0435\u043b\u044c\u0437\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043b \u0441\u0430\u043c: \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u0442\u0430\u043b\u0438 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 \u0431\u0435\u0437 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c, \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 &#8212; <code>EquatableArray<\/code>, \u0445\u044d\u0448-\u043a\u043e\u0434\u044b \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u044f\u0432\u043d\u043e. <code>EquatableArray<\/code> \u0438 \u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u044f \u043e\u043f\u044f\u0442\u044c \u0436\u0435 <a href=\"https:\/\/andrewlock.net\/creating-a-source-generator-part-10-testing-your-incremental-generator-pipeline-outputs-are-cacheable\/\" rel=\"noopener nofollow\">\u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0443 Andrew Lock<\/a>. \u0422\u0430\u043a\u043e\u0439 \u0442\u0435\u0441\u0442 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437 \u043d\u0430 \u043a\u043e\u043f\u0438\u0438 \u0442\u043e\u0439 \u0436\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0448\u0430\u0433\u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0432\u0435\u0440\u043d\u0443\u043b\u0438 <code>Cached<\/code> \u0438\u043b\u0438 <code>Unchanged<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u0430\u043b\u0438. Qwen \u0432 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0447\u0438\u043d\u0438\u043b \u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0442\u0435\u0441\u0442\u044b.<\/p>\n<p>\u0421\u043a\u0443\u0447\u043d\u0430\u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u044f, \u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442 \u00ab\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443 \u043c\u0435\u043d\u044f\u00bb \u043e\u0442 \u00ab\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u00bb. \u0418 \u044d\u0442\u043e \u0442\u0430 \u0447\u0430\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e LLM \u0441\u0430\u043c\u0430 \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0430: \u043a\u043e\u0434 \u0431\u0435\u0437 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 \u0442\u0435\u0441\u0442\u044b, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u0438\u0434\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 IDE.<\/p>\n<h3>\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c<\/h3>\n<p>\u0420\u0430\u0434\u0438 \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0451 \u0438 \u0437\u0430\u0442\u0435\u0432\u0430\u043b\u043e\u0441\u044c.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u043e\u043b\u0435 \u0432 <code>UserResponse<\/code> \u0438 \u0437\u0430\u0431\u044b\u043b\u0438 \u043f\u0440\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a &#8212; \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435:<\/p>\n<pre><code>warning FMAP005: The following members of 'UserResponse' have no matching source membersand will keep their default values: CreatedAt.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043b\u0435 \u043d\u0435 \u043c\u0430\u043f\u043f\u0438\u0442\u0441\u044f \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u043e &#8212; \u0441\u0442\u0430\u0432\u0438\u0442\u0435 <code>[FusionMapperIgnore]<\/code>. \u042d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0432\u043e \u0432\u0441\u0451\u043c API. \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0430\u0432\u0438\u0442\u044c <code>FMAP005<\/code> \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0437\u0430\u0447\u0435\u043c \u0432\u0430\u043c \u044d\u0442\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0435 <code>required<\/code> \u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043d\u0435\u0442, \u0442\u043e \u044d\u0442\u043e <code>FMAP001<\/code>: \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0441\u0435\u043f\u0442\u043e\u0440\u044b \u0438\u043b\u0438 <code>MappingException<\/code> \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u043f\u043e\u043b\u0435\u0439 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c-\u0440\u0435\u0436\u0438\u043c\u0435. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u0438\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 object initializer, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u0435\u0449\u0430\u043d\u0438\u0435 \u044f\u0437\u044b\u043a\u0430 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0441\u0442\u0435\u0439 \u043e\u0434\u043d\u043e: \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u0438\u043b\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u043f\u043e\u043b\u0435\u0439. \u041d\u0438\u043a\u043e\u0433\u0434\u0430 &#8212; \u043d\u043e\u043b\u044c \u0432 \u043f\u043e\u043b\u0435.<\/p>\n<h3>\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438<\/h3>\n<p>\u041d\u0430\u0438\u0432\u043d\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043d\u0430 \u0432\u0441\u0451 \u043f\u0438\u0448\u0435\u0442 <code>Select(...).ToList()<\/code>. \u041d\u043e \u0446\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c <code>IReadOnlyList&lt;T&gt;<\/code>, \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0435\u0439 \u0441 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c \u043e\u0442 <code>IEnumerable&lt;T&gt;<\/code>, \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0435\u0439 \u0441 <code>AddRange<\/code> \u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 <code>Add<\/code>. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u043d\u0430 \u0442\u0438\u043f \u0446\u0435\u043b\u0438 \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f. \u0414\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f collection expression <code>[.. items]<\/code>.<\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f &#8212; \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442. \u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0439: \u0441\u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u0431\u0438\u043d\u0434\u0438\u043d\u0433 \u0432 WPF \u0438\u043b\u0438 MAUI, \u0430 change tracker \u0432 EF \u0443\u0432\u0438\u0434\u0438\u0442 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0442\u043e, \u0447\u0442\u043e \u0432\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>Clear()<\/code> \u0438 \u043f\u043e\u0442\u043e\u043c <code>AddRange()<\/code> \u0438\u043b\u0438 <code>Add()<\/code> \u0432 \u0446\u0438\u043a\u043b\u0435, \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u0439 \u0436\u0435. \u041c\u0435\u043b\u043e\u0447\u044c, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0443\u0437\u043d\u0430\u0451\u0448\u044c, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0439\u043c\u0430\u0432 \u0431\u0430\u0433.<\/p>\n<h3>\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a<\/h3>\n<p>BenchmarkDotNet, Intel i9-9900KF, .NET 10.<\/p>\n<p>\u041f\u043b\u043e\u0441\u043a\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041c\u0435\u0442\u043e\u0434<\/p>\n<\/th>\n<th>\n<p align=\"left\">Mean<\/p>\n<\/th>\n<th>\n<p align=\"left\">Allocated<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">FusionMapper<\/p>\n<\/td>\n<td>\n<p align=\"left\">6.24 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">48 B<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Mapperly<\/p>\n<\/td>\n<td>\n<p align=\"left\">6.56 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">48 B<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0420\u0443\u0447\u043d\u043e\u0439 \u043c\u0430\u043f\u043f\u0438\u043d\u0433<\/p>\n<\/td>\n<td>\n<p align=\"left\">6.61 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">48 B<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Mapster<\/p>\n<\/td>\n<td>\n<p align=\"left\">16.66 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">48 B<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AutoMapper<\/p>\n<\/td>\n<td>\n<p align=\"left\">52.08 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">48 B<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0412\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, 4 \u0443\u0440\u043e\u0432\u043d\u044f:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041c\u0435\u0442\u043e\u0434<\/p>\n<\/th>\n<th>\n<p align=\"left\">Mean<\/p>\n<\/th>\n<th>\n<p align=\"left\">Allocated<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0420\u0443\u0447\u043d\u043e\u0439 \u043c\u0430\u043f\u043f\u0438\u043d\u0433<\/p>\n<\/td>\n<td>\n<p align=\"left\">8.88 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">48 B<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Mapperly<\/p>\n<\/td>\n<td>\n<p align=\"left\">16.68 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">48 B<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">FusionMapper<\/p>\n<\/td>\n<td>\n<p align=\"left\">17.44 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">48 B<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Mapster<\/p>\n<\/td>\n<td>\n<p align=\"left\">39.17 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">48 B<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AutoMapper<\/p>\n<\/td>\n<td>\n<p align=\"left\">104.04 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">48 B<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041f\u0440\u043e\u0435\u043a\u0446\u0438\u044f EF-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 1000 \u0441\u0442\u0440\u043e\u043a: \u0440\u0443\u0447\u043d\u0430\u044f 1.09 ms, AutoMapper 1.11 ms, Mapster 1.13 ms, FusionMapper 1.14 ms. \u041f\u0430\u0440\u0438\u0442\u0435\u0442, \u0438 \u044d\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e: \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0435\u043b\u0430\u0435\u0442 \u0431\u0430\u0437\u0430.<\/p>\n<p>\u0411\u044b\u0441\u0442\u0440\u0435\u0435 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 \u043d\u0430 0.37 \u043d\u0430\u043d\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u044b &#8212; \u044d\u0442\u043e \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c, \u0430 \u043d\u0435 \u043f\u043e\u0431\u0435\u0434\u0430. \u0421 Mapperly \u043f\u0430\u0440\u0438\u0442\u0435\u0442, \u043d\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0433\u0440\u0430\u0444\u0430\u0445 \u043e\u043d \u0434\u0430\u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u043f\u0435\u0440\u0435\u0434\u0438. \u0420\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441 AutoMapper \u043d\u0430 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043f\u0443\u0442\u044f\u0445: \u0432 6-8 \u0440\u0430\u0437.<\/p>\n<p>\u0411\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e \u0446\u0435\u043b\u044c\u044e. \u041e\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0430: \u0435\u0441\u043b\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434, \u0447\u0442\u043e \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0440\u0443\u043a\u0430\u043c\u0438, \u0442\u043e \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a \u0436\u0435.<\/p>\n<p>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 \u0434\u0435\u043b\u0430\u043b <em>GLM-5.3-Flash<\/em>.<\/p>\n<h3>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435<\/h3>\n<p>\u041c\u0430\u043f\u043f\u0435\u0440 \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c <code>User<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0432\u0437\u044f\u043b \u0448\u0430\u0431\u043b\u043e\u043d Clean Architecture \u0414\u0436\u0435\u0439\u0441\u043e\u043d\u0430 \u0422\u0435\u0439\u043b\u043e\u0440\u0430: .NET 10, Aspire, EF Core, MediatR. \u0418 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0431\u0440\u0430\u043b \u0438\u0437 \u043d\u0435\u0433\u043e AutoMapper 16.<\/p>\n<ul>\n<li>\n<p>5 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e<\/p>\n<\/li>\n<li>\n<p>3 \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u044b \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c <code>ForMember<\/code> \u043d\u0430 \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442<\/p>\n<\/li>\n<li>\n<p><code>AddAutoMapper<\/code> \u0443\u0434\u0430\u043b\u0451\u043d \u0438\u0437 DI, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0447\u0435\u0433\u043e<\/p>\n<\/li>\n<li>\n<p><code>IMapper<\/code> \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0432\u043d\u0435\u0434\u0440\u044f\u0435\u0442\u0441\u044f \u0432 \u0445\u0435\u043d\u0434\u043b\u0435\u0440<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e &#8212; \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u0432 EF:<\/p>\n<pre><code class=\"cs\">\/\/ \u0411\u044b\u043b\u043eLists = await _context.TodoLists    .ProjectTo&lt;TodoListDto&gt;(_mapper.ConfigurationProvider)    .OrderBy(t =&gt; t.Title)    .ToListAsync(cancellationToken);\/\/ \u0421\u0442\u0430\u043b\u043eLists = await _context.TodoLists    .Project()    .To&lt;TodoListDto&gt;()    .OrderBy(t =&gt; t.Title)    .ToListAsync(cancellationToken);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 SQL. \u041c\u0430\u043f\u043f\u0438\u043d\u0433 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0434\u0435\u043b\u0441\u044f, \u043c\u043e\u0434\u0435\u043b\u0438 \u0442\u0435 \u0436\u0435. \u0423\u0448\u043b\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0435\u0433\u043e.<\/p>\n<p>\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0442\u043e\u0436\u0435 \u0434\u0435\u043b\u0430\u043b <em>GLM-5.3-Flash<\/em>. \u0414\u043b\u044f \u043d\u0435\u0433\u043e \u044d\u0442\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430: \u043c\u0435\u0445\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f, \u0441 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 &#8212; \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438 \u0442\u0435\u0441\u0442\u044b \u0437\u0435\u043b\u0451\u043d\u044b\u0435.<\/p>\n<p>\u041a\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u0443\u0442: <a href=\"https:\/\/github.com\/gandjustas\/FusionMapper\/tree\/main\/examples\/CleanArchitecture\" rel=\"noopener nofollow\">https:\/\/github.com\/gandjustas\/FusionMapper\/tree\/main\/examples\/CleanArchitecture<\/a><\/p>\n<h2>\u0427\u0435\u0433\u043e \u043d\u0435\u0442<\/h2>\n<ul>\n<li>\n<p>\u0440\u0443\u0447\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438: \u043d\u0438\u043a\u0430\u043a\u0438\u0445 <code>MapFrom<\/code>, <code>ConvertUsing<\/code> \u0438 \u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0433\u0440\u0430\u0444\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435: \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0442\u0438\u043f\u0430\u043c<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 .NET \u043d\u0438\u0436\u0435 8<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0430\u0436\u0434\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b \u043e\u0434\u043d\u0438\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c: \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u044d\u0442\u043e \u0432 \u0442\u0435\u0445 \u0434\u0432\u0443\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u0438? \u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c &#8212; \u043d\u0435\u0442. \u0426\u0438\u043a\u043b\u044b &#8212; \u043d\u0435\u0442. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f &#8212; \u043d\u0435\u0442.<\/p>\n<h2>\u041a\u043e\u0433\u0434\u0430 FusionMapper \u043d\u0435 \u043d\u0443\u0436\u0435\u043d<\/h2>\n<ul>\n<li>\n<p>\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0442\u0440\u0438 DTO &#8212; \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0440\u0443\u043a\u0430\u043c\u0438 \u0438\u043b\u0438 \u043f\u0443\u0441\u0442\u044c \u0418\u0418 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442, \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e<\/p>\n<\/li>\n<li>\n<p>\u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u043d\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437 \u0438\u043c\u0451\u043d \u0438 \u043d\u0443\u0436\u043d\u0430 \u0440\u0443\u0447\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>\u043c\u043e\u0434\u0435\u043b\u0438 \u0441 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u0438\u043b\u0438 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u043c &#8212; \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u043f\u0440\u043e DTO<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 .NET Framework \u0438\u043b\u0438 .NET 6<\/p>\n<\/li>\n<\/ul>\n<h3>\u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u0435\u043d<\/h3>\n<ul>\n<li>\n<p>\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0439 \u0432 EF \u0438 \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043b\u043e\u043c\u0430\u043b\u043e \u0441\u0431\u043e\u0440\u043a\u0443, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0434<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b \u0443\u0445\u043e\u0434\u0438\u0442\u0435 \u0441 <em>AutoMapper<\/em> \u043f\u043e\u0441\u043b\u0435 \u0441\u043c\u0435\u043d\u044b \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0438 \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u0432\u043e\u0434\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441-\u043c\u0430\u043f\u043f\u0435\u0440 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u0430\u0440\u0443 \u0442\u0438\u043f\u043e\u0432<\/p>\n<\/li>\n<\/ul>\n<h3>\u0418\u0442\u043e\u0433\u043e<\/h3>\n<p>\u041a\u0442\u043e \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u043b, \u0435\u0441\u043b\u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435:<\/p>\n<ul>\n<li>\n<p><em>Qwen<\/em> &#8212; \u0440\u0430\u043d\u0442\u0430\u0439\u043c-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440, \u0442\u0435\u0441\u0442\u044b, \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u043d\u0430 source generator, \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432<\/p>\n<\/li>\n<li>\n<p><em>GLM-5.3-Flash<\/em> &#8212; \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u043c, \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432<\/p>\n<\/li>\n<li>\n<p><em>Claude<\/em> &#8212; \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u043b\u0438\u0440\u043e\u0432\u043a\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>\u044f &#8212; API, \u043a\u043e\u043d\u0432\u0435\u043d\u0446\u0438\u0438, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0441 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c, \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e \u0442\u043e\u043c, \u0447\u0435\u0433\u043e \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0434\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0432 NuGet \u043f\u0440\u043e\u0448\u043b\u043e 16 \u0434\u043d\u0435\u0439. 37 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432, 201 \u0442\u0435\u0441\u0442. \u0411\u0435\u0437 LLM \u044d\u0442\u043e \u0437\u0430\u043d\u044f\u043b\u043e \u0431\u044b \u0432 \u0440\u0430\u0437\u044b \u0431\u043e\u043b\u044c\u0448\u0435. \u041d\u043e \u0442\u043e, \u0447\u0442\u043e LLM \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0430 \u0441\u0430\u043c\u0430, &#8212; \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0435 \u0438 \u043e\u0442\u043a\u0430\u0437 \u043e\u0442 \u043b\u0438\u0448\u043d\u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 &#8212; \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u043e, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438\u043b\u0438 \u043d\u0435\u0442.<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e \u044f \u0432\u044b\u043d\u0435\u0441 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438: \u0442\u0438\u0448\u0438\u043d\u0430 &#8212; \u0445\u0443\u0434\u0448\u0438\u0439 \u0432\u0438\u0434 \u043e\u0448\u0438\u0431\u043a\u0438, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 <a href=\"https:\/\/en.wikipedia.org\/wiki\/The_Pragmatic_Programmer\" rel=\"noopener nofollow\">\u043e\u0434\u043d\u043e\u0439 \u0443\u043c\u043d\u043e\u0439 \u043a\u043d\u0438\u0433\u0435<\/a><\/p>\n<blockquote>\n<p>crash, don\u2019t trash<\/p>\n<\/blockquote>\n<p>\u041c\u043e\u0440\u0430\u043b\u044c: \u0435\u0441\u043b\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0442\u0440\u0438 DTO &#8212; \u043f\u0438\u0448\u0438\u0442\u0435 \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0440\u0443\u043a\u0430\u043c\u0438. \u0415\u0441\u043b\u0438 \u0438\u0445 \u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044c &#8212; \u043f\u0443\u0441\u0442\u044c \u0437\u0430 \u043d\u0438\u043c\u0438 \u0441\u043b\u0435\u0434\u0438\u0442 \u0441\u0431\u043e\u0440\u043a\u0430, \u0430 \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0432 \u043f\u0440\u043e\u0434\u0435.<\/p>\n<p>\u041a\u043e\u0434: <a href=\"https:\/\/github.com\/gandjustas\/FusionMapper\" rel=\"noopener nofollow\">https:\/\/github.com\/gandjustas\/FusionMapper<\/a><\/p>\n<p>\u041f\u0430\u043a\u0435\u0442:<\/p>\n<pre><code class=\"bash\">dotnet add package FusionMapper<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0451\u0442\u0435 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u0432\u0435\u043d\u0446\u0438\u0438 \u0441\u043b\u043e\u043c\u0430\u043b\u0438\u0441\u044c \u043c\u043e\u043b\u0447\u0430 &#8212; \u044d\u0442\u043e \u0431\u0430\u0433 \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e. \u0417\u0430\u0432\u043e\u0434\u0438\u0442\u0435 issue \u043d\u0430 github.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1087338\/\">https:\/\/habr.com\/ru\/articles\/1087338\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u042f \u043d\u0435 \u043b\u044e\u0431\u043b\u044e Clean Architecture, \u043d\u0435 \u043b\u044e\u0431\u043b\u044e DTO \u0438 \u043d\u0435 \u043b\u044e\u0431\u043b\u044e \u043c\u0430\u043f\u043f\u0435\u0440\u044b.\u041e\u043d\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0431\u0430\u0437\u0443 \u0432 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0447\u0435\u0442\u044b\u0440\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0442\u0440\u0438 \u0441\u043b\u043e\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0438 \u043f\u0430\u043f\u043a\u0443 Mappings, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u043b \u0441\u043e \u0432\u0440\u0435\u043c\u0451\u043d \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430. \u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435 \u043d\u0430 \u0444\u043e\u0440\u043c\u0443, \u043d\u0430\u0434\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, DTO, \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440, \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 \u0438 \u0442\u0435\u0441\u0442 \u043d\u0430 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430. \u0428\u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b\u043e\u0432 \u0440\u0430\u0434\u0438 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0438. \u0410 \u0435\u0441\u043b\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043d\u0438\u0445 \u0437\u0430\u0431\u044b\u0442\u044c, \u043d\u0438\u043a\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043a\u0430\u0436\u0435\u0442.\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043c\u0430\u043f\u043f\u0435\u0440.\u0415\u0441\u043b\u0438 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043c\u0435\u0441\u0442\u0430, \u0433\u0434\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u043c\u0435\u0441\u0442\u0430, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u043c\u0430\u043f\u043f\u0435\u0440\u044b \u0438\u0445 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0438 \u0447\u0442\u043e \u044f \u0432 \u0438\u0442\u043e\u0433\u0435 \u0441 \u044d\u0442\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u043b.\u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u043f\u043f\u0435\u0440\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 CRUD. \u0415\u0441\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u0432 \u0431\u0430\u0437\u0435 \u0443 \u043d\u0435\u0451 \u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044c \u043f\u043e\u043b\u0435\u0439:public class User{    public Guid Id { get; set; }    public string FirstName { get; set; } = &#171;&#187;;    public string LastName { get; set; } = &#171;&#187;;    public string? Bio { get; set; }    public bool IsBlocked { get; set; }    public DateTimeOffset CreatedAt { get; set; }    \/\/ &#8230;\u0438 \u0435\u0449\u0451 \u0434\u0432\u0430 \u0434\u0435\u0441\u044f\u0442\u043a\u0430}\u0415\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438:public class UserResponse{    public Guid Id { get; init; }    public string FirstName { get; init; } = &#171;&#187;;    public string LastName { get; init; } = &#171;&#187;;    public bool IsBlocked { get; init; }}public class UpdateUserRequest{    public string FirstName { get; init; } = &#171;&#187;;    public string LastName { get; init; } = &#171;&#187;;    public string? Bio { get; init; }}\u042d\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u0442. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0440\u0435\u0437\u044b User. \u0421 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0445 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442 \u0434\u0432\u0430 \u043c\u0435\u0441\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0440\u0443\u043a\u0430\u043c\u0438.\u041c\u0435\u0441\u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0435 &#8212; \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435:var users = await db.Users    .Where(u =&gt; !u.IsBlocked)    .Select(u =&gt; new UserResponse    {        Id = u.Id,        FirstName = u.FirstName,        LastName = u.LastName,        IsBlocked = u.IsBlocked,    })    .ToListAsync(ct);\u041f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u043d\u0443\u0436\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0442\u0430\u0449\u0438\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0440\u0430\u0434\u0438 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u043f\u043e\u043b\u0435\u0439. \u041c\u0435\u043d\u044c\u0448\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0441\u0435\u0442\u0438, \u043d\u0435\u0442 \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430.\u041c\u0435\u0441\u0442\u043e \u0432\u0442\u043e\u0440\u043e\u0435 &#8212; \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0432 \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u043b\u0438 \u044d\u043d\u0434\u043f\u043b\u043e\u0438\u043d\u0442\u0435:var user = await db.Users.FindAsync([request.Id], ct);user.FirstName = request.FirstName;user.LastName = request.LastName;user.Bio = request.Bio;await db.SaveChangesAsync(ct);\u0422\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u043d\u0443\u0436\u0435\u043d \u0447\u0442\u043e\u0431\u044b \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c overposting \u0432 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430\u0445.\u041f\u0440\u043e \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u0438\u0448\u0435\u0442 \u0441\u0442\u0430\u0442\u0435\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0451\u043c \u043d\u0435\u0447\u0435\u0433\u043e \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u0442\u044c. \u041d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0448\u044c.\u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438 \u043d\u0435 \u0442\u0430\u043a\u041f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435: \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u043d\u0443\u0436\u0435\u043d CreatedAt. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u044e \u043f\u043e\u043b\u0435 \u0432 \u043c\u043e\u0434\u0435\u043b\u044c:public class UserResponse{    \/\/ &#8230;    public DateTimeOffset CreatedAt { get; init; } \/\/ \u043d\u043e\u0432\u043e\u0435}\u0415\u0441\u043b\u0438 \u0437\u0430\u0431\u044b\u0442\u044c \u0434\u043e\u043f\u0438\u0441\u0430\u0442\u044c CreatedAt = u.CreatedAt \u0432 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e, \u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u043d\u0438\u0447\u0435\u0433\u043e. Object initializer \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u0421\u0431\u043e\u0440\u043a\u0430 \u0437\u0435\u043b\u0451\u043d\u0430\u044f, \u0442\u0435\u0441\u0442\u044b \u0437\u0435\u043b\u0451\u043d\u044b\u0435, \u0430 \u0432 API \u0443\u0435\u0437\u0436\u0430\u0435\u0442 0001-01-01T00:00:00. \u0421\u0443\u0434\u044f \u043f\u043e \u043e\u0442\u0432\u0435\u0442\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043f\u0440\u0438 \u041e\u043a\u0442\u0430\u0432\u0438\u0430\u043d\u0435 \u0410\u0432\u0433\u0443\u0441\u0442\u0435.\u0421 \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u043e\u043c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435. \u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438, &#8212; \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0435\u0433\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c.\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443:\u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u043b\u0435 \u0432 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 &#8212; \u0441\u0431\u043e\u0440\u043a\u0430 \u0443\u043f\u0430\u0434\u0451\u0442\u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432 \u0446\u0435\u043b\u0438 &#8212; \u0442\u0438\u0448\u0438\u043d\u0430\u0410 \u043a\u0430\u043a \u0436\u0435 required?\u041d\u0430 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0441\u043a\u0430\u0436\u0435\u0442: \u0432 C# 11 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c required.public class UserResponse{    public required DateTimeOffset CreatedAt { get; init; }}var r = new UserResponse { Id = Guid.NewGuid() };\/\/ error CS9035: Required member &#8216;CreatedAt&#8217; must be set in the object initializer.\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440. Runtime-\u043c\u0430\u043f\u043f\u0435\u0440\u044b \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044e \u0438\u043b\u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043c\u0438\u043c\u043e object initializer. \u0414\u043b\u044f \u043d\u0438\u0445 required &#8212; \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e. \u042d\u0442\u043e \u043d\u0435 \u043d\u0435\u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0430 \u043f\u0440\u044f\u043c\u043e\u0435 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u0440\u0430\u043d\u0442\u0430\u0439\u043c-\u043f\u043e\u0434\u0445\u043e\u0434\u0430.\u0418\u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435:\u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f IQueryable, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 SQL \u0438 \u0441\u0430\u043c\u0430 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u0438\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0442\u0440\u0435\u043a\u0430\u0435\u0442 EF, \u0431\u0435\u0437 \u0435\u0451 \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f\u043d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432 \u0446\u0435\u043b\u0438 &#8212; \u044d\u0442\u043e \u0441\u0438\u0433\u043d\u0430\u043b \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0441\u0431\u043e\u0440\u043a\u0438, \u0430 \u043d\u0435 null \u0432 \u043f\u0440\u043e\u0434\u0435\u041d\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430. \u0414\u0432\u0430 \u043c\u0435\u0441\u0442\u0430 \u0438 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0439.\u0427\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u0440\u044b\u043d\u043a\u0435\u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u0432\u0441\u0451 \u043f\u043b\u043e\u0445\u043e.AutoMapper\u0421\u0430\u043c \u044f AutoMapper \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b. \u041d\u043e \u043f\u043e\u0447\u0442\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043a\u0443\u0434\u0430 \u044f \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b, \u043e\u043d \u0443\u0436\u0435 \u0431\u044b\u043b. \u041e\u0431\u044b\u0447\u043d\u043e \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435 \u0441 Clean Architecture, MediatR \u0438 \u0442\u043e\u0439 \u0441\u0430\u043c\u043e\u0439 \u043f\u0430\u043f\u043a\u043e\u0439 Mappings.public class UserProfile : Profile{    public UserProfile()    {        CreateMap&lt;User, UserResponse&gt;();        CreateMap&lt;UpdateUserRequest, User&gt;();    }}\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435\u0432\u0438\u043d\u043d\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e \u043f\u0443\u043d\u043a\u0442\u0430\u043c.1. \u041e\u0448\u0438\u0431\u043a\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435. \u0417\u0430\u0431\u044b\u043b\u0438 CreateMap &#8212; \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u0438\u0437 AutoMapperMappingException: Missing type map configuration or unsupported mapping \u0432 \u043b\u043e\u0433\u0430\u0445. \u041f\u043e\u043b\u0435 \u0432 \u0446\u0435\u043b\u0438 \u043d\u0435 \u043d\u0430\u0448\u043b\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a &#8212; \u043d\u0435 \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u0432\u043e\u043e\u0431\u0449\u0435, \u043e\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f default. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c AssertConfigurationIsValid(), \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0430\u0434\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0432 \u0442\u0435\u0441\u0442\u0430\u0445. \u0423\u0433\u0430\u0434\u0430\u0439\u0442\u0435, \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u043e \u043d\u0435\u0451 \u0437\u0430\u0431\u044b\u0432\u0430\u044e\u0442.2. \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043b\u043e\u043c\u0430\u0435\u0442 \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u043c\u043e\u043b\u0447\u0430. \u041c\u0430\u043f\u043f\u0438\u043d\u0433 \u043f\u043e \u043a\u043e\u043d\u0432\u0435\u043d\u0446\u0438\u0438 &#8212; \u044d\u0442\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a. \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043b\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u043e\u043c \u0432 IDE &#8212; \u0441\u0442\u0443\u0434\u0438\u044f \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432\u0441\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f, \u0430 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b. Find Usages \u043f\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443 DTO \u043d\u0435 \u043f\u043e\u043a\u0430\u0436\u0435\u0442, \u043e\u0442\u043a\u0443\u0434\u0430 \u043e\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f. F12 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0432\u0435\u0434\u0451\u0442.3. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f &#8212; \u044d\u0442\u043e \u043a\u043e\u0434, \u0442\u043e\u043b\u044c\u043a\u043e \u0445\u0443\u0436\u0435. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0432\u0435\u043d\u0446\u0438\u0438 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442, \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f ForMember, MapFrom, ConvertUsing, IValueResolver, AfterMap. \u0420\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437 DI, \u0432 MapFrom \u0443\u0435\u0437\u0436\u0430\u044e\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u0438 \u0447\u0435\u0440\u0435\u0437 \u0433\u043e\u0434 \u0432 \u043f\u0440\u043e\u0444\u0438\u043b\u044f\u0445 \u0436\u0438\u0432\u0451\u0442 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0432\u0438\u0434\u0438\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u043e\u0444\u0438\u043b\u0438 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u0432\u0437\u044f\u043b\u043e\u0441\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u0430\u0434\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u0440\u043e\u0444\u0438\u043b\u044c, \u0432 \u043f\u0440\u043e\u0444\u0438\u043b\u0435 &#8212; ForMember, \u0432 \u043d\u0451\u043c &#8212; \u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440, \u0432 \u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u0435 &#8212; \u0441\u0435\u0440\u0432\u0438\u0441.4. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435 \u043f\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e. \u0410\u0432\u0442\u043e\u0440 AutoMapper \u0441\u0430\u043c \u043f\u0438\u0441\u0430\u043b, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u043f\u043e\u0434 \u043e\u0434\u0438\u043d \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439: \u0446\u0435\u043b\u044c &#8212; \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u043f\u043b\u044e\u0449\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e view model. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u0440\u0443\u0433\u0430\u044f, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0432\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u0410 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0447\u0435\u0440\u0435\u0437 AutoMapper \u043c\u0430\u043f\u043f\u044f\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443.5. IMapper \u0432\u0435\u0437\u0434\u0435. \u0414\u043b\u044f Map \u043d\u0443\u0436\u0435\u043d IMapper, \u0434\u043b\u044f ProjectTo &#8212; IConfigurationProvider. \u0417\u043d\u0430\u0447\u0438\u0442, AddAutoMapper \u0432 DI, \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0431\u043e\u0440\u043e\u043a \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0438 IMapper \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u0430. \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u043d\u0435\u0434\u0440\u044f\u044e\u0442 \u0440\u0430\u0434\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043b\u043e\u0436\u0438\u0442\u044c \u043f\u043e\u043b\u044f \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439.6. required \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0441\u043c. \u0432\u044b\u0448\u0435.7. \u041c\u0435\u0434\u043b\u0435\u043d\u043d\u043e. AutoMapper \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 8 \u0440\u0430\u0437. \u0426\u0438\u0444\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u043d\u0438\u0436\u0435.\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f. \u0421 15-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 (\u0438\u044e\u043b\u044c 2025) AutoMapper \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0439 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043e\u0434 MIT &#8212; 14-\u044f. \u041a \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c, \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u0435\u0449\u0451 \u0438 \u044e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0430\u044f.\u042d\u0442\u043e \u0437\u0430\u043a\u043e\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u0430. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u0442\u044c, \u0442\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0437\u0430\u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u0442\u044c \u043d\u0430 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d AutoMapper.MapperlyMapperly &#8212; \u043b\u0443\u0447\u0448\u0438\u0439 \u0438\u0437 \u0442\u0440\u0451\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043e\u0431\u0438\u0434\u043d\u044b. Source generator, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 C#, \u043d\u043e\u043b\u044c \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438. \u041d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0447\u043b\u0435\u043d\u044b \u0446\u0435\u043b\u0438 \u043b\u043e\u0432\u0438\u0442 (RMG012), required \u0443\u0432\u0430\u0436\u0430\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 object initializer, \u0438 \u044f\u0437\u044b\u043a \u0441\u0430\u043c \u0432\u044b\u0434\u0430\u0441\u0442 CS9035.\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0446\u0435\u043d\u0430:[Mapper]public static partial class UserMapper{    public static partial UserResponse ToResponse(User user);    public static partial void UpdateUser(UpdateUserRequest request, User user);    public static partial IQueryable&lt;UserResponse&gt; ProjectToResponse(this IQueryable&lt;User&gt; q);}1. \u041c\u0430\u043f\u043f\u0435\u0440 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u0430\u0440\u0443. \u0422\u0440\u0438\u0434\u0446\u0430\u0442\u044c DTO &#8212; \u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044c partial-\u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u041f\u043b\u044e\u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e. \u041f\u043b\u044e\u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442. \u0420\u0443\u0447\u043d\u043e\u0439 \u043c\u0430\u043f\u043f\u0438\u043d\u0433, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f, \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0441\u044f \u0432 \u0440\u0443\u0447\u043d\u043e\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430. \u0421\u0442\u0440\u043e\u043a \u043c\u0435\u043d\u044c\u0448\u0435, \u0446\u0435\u0440\u0435\u043c\u043e\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435.2. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u0430 \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b. \u041d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 &#8212; \u044d\u0442\u043e [MapProperty(nameof(User.FirstName), nameof(UserResponse.Name))] \u0438\u043b\u0438 [MapperIgnoreTarget(&#8230;)]. \u0422\u0435 \u0436\u0435 ForMember \u0438\u0437 AutoMapper, \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u043a\u043e\u0431\u043a\u0430\u0445.3. \u0412\u044b\u0437\u043e\u0432 \u043d\u0435 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435. \u0425\u043e\u0447\u0435\u0448\u044c \u043c\u0430\u043f\u043f\u0438\u043d\u0433 &#8212; \u043d\u0430\u0439\u0434\u0438, \u0432 \u043a\u0430\u043a\u043e\u043c \u043c\u0430\u043f\u043f\u0435\u0440\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434. \u041d\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e &#8212; \u0438\u0434\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0439. \u041c\u0430\u043f\u043f\u0435\u0440 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0435\u0449\u0451 \u043e\u0434\u043d\u0438\u043c \u0441\u043b\u043e\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c. \u041a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e, \u0447\u0435\u0433\u043e \u043c\u043d\u0435 \u0432 Clean Architecture \u0438 \u0442\u0430\u043a \u0445\u0432\u0430\u0442\u0430\u0435\u0442.4. Generic-\u043a\u043e\u0434 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. Mapperly \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0430\u0440 \u0442\u0438\u043f\u043e\u0432, \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 generic-\u043c\u0435\u0442\u043e\u0434\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u0431\u0430\u0437\u043e\u0432\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438\u043b\u0438 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u043c \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u0435, \u0442\u0438\u043f\u043e\u0432 \u0442\u0430\u043c \u043d\u0435\u0442, \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e TEntity \u0438 TDto:public Task&lt;List&lt;TDto&gt;&gt; GetAll&lt;TEntity, TDto&gt;() where TEntity : class{    IQueryable&lt;TEntity&gt; query = db.Set&lt;TEntity&gt;();    IQueryable&lt;TDto&gt; projected = ???; \/\/ \u043a\u0430\u043a\u043e\u0439 partial-\u043c\u0435\u0442\u043e\u0434 \u043c\u0430\u043f\u043f\u0435\u0440\u0430 \u0441\u044e\u0434\u0430 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c?    return projected.ToListAsync();}\u0414\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0443\u0436\u0435\u043d \u0440\u0430\u043d\u0442\u0430\u0439\u043c-\u0444\u043e\u043b\u043b\u0431\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442 \u043c\u0430\u043f\u043f\u0438\u043d\u0433, \u043a\u043e\u0433\u0434\u0430 \u0442\u0438\u043f\u044b \u0441\u0442\u0430\u043d\u0443\u0442 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b. \u0412 Mapperly \u0435\u0433\u043e \u043d\u0435\u0442: generic-\u043c\u0435\u0442\u043e\u0434\u044b \u043c\u0430\u043f\u043f\u0435\u0440\u0430 \u0443\u043c\u0435\u044e\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043f\u0430\u0440, \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0432 \u0442\u043e\u043c \u0436\u0435 \u043c\u0430\u043f\u043f\u0435\u0440\u0435.MapsterMapster &#8212; \u044d\u0442\u043e AutoMapper, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0448\u0438\u043b \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u0439. \u041f\u0440\u043e\u0449\u0435 \u043d\u0430 \u0432\u0445\u043e\u0434\u0435, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u043d\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c.var dto = user.Adapt&lt;UserResponse&gt;();                                    \/\/ \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442request.Adapt(user);                                                     \/\/ \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442var list = await db.Users.ProjectToType&lt;UserResponse&gt;().ToListAsync(ct); \/\/ \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f\u041d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438:TypeAdapterConfig&lt;User, UserResponse&gt;    .NewConfig()    .Map(d =&gt; d.FullName, s =&gt; s.FirstName + &#187; &#187; + s.LastName);1. Adapt \u0432\u0438\u0441\u0438\u0442 \u043d\u0430 object. \u041c\u0435\u0442\u043e\u0434 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u043a\u0430\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f object, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 IntelliSense \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0435\u0433\u043e \u043d\u0430 \u0432\u0441\u0451\u043c \u043f\u043e\u0434\u0440\u044f\u0434. 42.Adapt&lt;UserResponse&gt;() \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0422\u0438\u043f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0435\u0447\u0435\u0433\u043e.2. \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0436\u0438\u0432\u0451\u0442 \u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c TypeAdapterConfig.GlobalSettings. \u041b\u044e\u0431\u043e\u0439 \u043a\u043e\u0434 \u0432 \u043b\u044e\u0431\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u0435\u0451 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c, \u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 &#8212; \u0432\u0430\u0448\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.3. \u041e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435. \u041c\u0430\u043f\u043f\u0438\u043d\u0433 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u0447\u0442\u043e \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0446\u0435\u043b\u0438 \u0435\u0441\u0442\u044c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a, \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c: RequireDestinationMemberSource = true \u043f\u043b\u044e\u0441 \u0432\u044b\u0437\u043e\u0432 Compile() \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u043d\u0430 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0430. \u0418 \u0434\u0430\u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u0430\u044f, \u043e\u043d\u0430 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u043d\u0435 \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435.4. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u0431\u043e\u043a\u0443&#8230;.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-496314","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/496314","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=496314"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/496314\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=496314"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=496314"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=496314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}