{"id":311543,"date":"2020-10-15T21:00:50","date_gmt":"2020-10-15T21:00:50","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=311543"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=311543","title":{"rendered":"\u041a\u0430\u043a DDD \u043f\u043e\u043c\u043e\u0433 \u043d\u0430\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0440\u0435\u0432\u0438\u0437\u0438\u0438 \u0432 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u044f\u0445"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/523540\/\">\u0412 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u044f\u0445 \u0432\u0430\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0443\u0447\u0451\u0442\u0430 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0430\u0441\u0430\u043c\u0438. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0443\u0436\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0442\u0435\u0440\u044f\u0442\u044c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b, \u043d\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043a\u0443\u043f\u043a\u0438 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0441\u044f\u0446. \u0412\u0430\u0436\u043d\u0430\u044f \u0440\u043e\u043b\u044c \u0432 \u0443\u0447\u0451\u0442\u0435 \u0443 \u0440\u0435\u0432\u0438\u0437\u0438\u0439. \u041e\u043d\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0438 \u0441\u0432\u0435\u0440\u044f\u0442\u044c \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u0442\u043e, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/nw\/w_\/hl\/nww_hlga61qdf3xe-mnjjpe7xus.png\"><\/p>\n<p>  \u0420\u0435\u0432\u0438\u0437\u0438\u044f \u0432 \u0414\u043e\u0434\u043e \u043d\u0435 \u0431\u0443\u043c\u0430\u0436\u043d\u0430\u044f: \u0443 \u0440\u0435\u0432\u0438\u0437\u043e\u0440\u0430 \u0435\u0441\u0442\u044c \u043f\u043b\u0430\u043d\u0448\u0435\u0442, \u0433\u0434\u0435 \u0440\u0435\u0432\u0438\u0437\u043e\u0440 \u043e\u0442\u043c\u0435\u0447\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043e\u0442\u0447\u0435\u0442\u044b. \u041d\u043e \u0434\u043e 2020 \u0433\u043e\u0434\u0430 \u0432 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u044f\u0445 \u0440\u0435\u0432\u0438\u0437\u0438\u044f \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0431\u0443\u043c\u0430\u0436\u043a\u0430\u0445 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043a \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0449\u0435 \u0438 \u043b\u0435\u0433\u0447\u0435. \u042d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u043e \u043a \u043d\u0435\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c, \u043e\u0448\u0438\u0431\u043a\u0430\u043c \u0438 \u043f\u043e\u0442\u0435\u0440\u044f\u043c, \u2014 \u043b\u044e\u0434\u0438 \u043e\u0448\u0438\u0431\u0430\u044e\u0442\u0441\u044f, \u0431\u0443\u043c\u0430\u0436\u043a\u0438 \u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f, \u0430 \u0435\u0449\u0451 \u0438\u0445 \u043c\u043d\u043e\u0433\u043e. \u041c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0438 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043f\u043b\u0430\u043d\u0448\u0435\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431. \u0412 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c DDD. \u041a\u0430\u043a \u0443 \u043d\u0430\u0441 \u044d\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u0440\u0430\u0442\u043a\u043e \u043e \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u0445, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0445\u0435\u043c\u0443 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432, \u0438 \u0433\u0434\u0435 \u0432 \u043d\u0435\u0439 \u0440\u0435\u0432\u0438\u0437\u0438\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0434\u0435\u0442\u0430\u043b\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e.<\/p>\n<h2>\u0421\u0445\u0435\u043c\u0430 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0438 \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u0430 \u0440\u0435\u0432\u0438\u0437\u0438\u044f<\/h2>\n<p>  \u0412 \u043d\u0430\u0448\u0435\u0439 \u0441\u0435\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 600 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u0439 (\u0438 \u044d\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0442\u0438). \u0412 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0441\u044b\u0440\u044c\u044f: \u043e\u0442 \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0434\u0430\u0436\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432, \u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0439 \u0438\u043d\u0433\u0440\u0435\u0434\u0438\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0441\u0440\u043e\u043a\u0443 \u0433\u043e\u0434\u043d\u043e\u0441\u0442\u0438, \u0434\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u0441\u044b\u0440\u044c\u044f \u0432 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u0438 \u0441\u0435\u0442\u0438. \u041d\u0430 \u0431\u0430\u043b\u0430\u043d\u0441\u0435 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043e\u043a\u043e\u043b\u043e 120 \u043f\u043e\u0437\u0438\u0446\u0438\u0439, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432, \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u043d\u044b\u0445, \u0445\u043e\u0437\u044f\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0438 \u0445\u0438\u043c\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0447\u0438\u0441\u0442\u043e\u0442\u044b \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u0438. \u0414\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u0435\u043d \u00ab\u0443\u0447\u0451\u0442\u00bb, \u0447\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a\u043e\u0433\u043e \u0441\u044b\u0440\u044c\u044f \u0441 \u0438\u0437\u0431\u044b\u0442\u043a\u043e\u043c, \u0430 \u043a\u0430\u043a\u043e\u0433\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442.\u00a0<\/p>\n<p>  \u00ab\u0423\u0447\u0451\u0442\u00bb \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0441\u044b\u0440\u044c\u044f \u0432 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u044f\u0445. \u041f\u043e\u0441\u0442\u0430\u0432\u043a\u0430 \u2014 \u044d\u0442\u043e \u00ab\u043f\u043b\u044e\u0441\u00bb \u043d\u0430 \u0431\u0430\u043b\u0430\u043d\u0441\u0435, \u0430 \u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u2014 \u00ab\u043c\u0438\u043d\u0443\u0441\u00bb. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0437\u0430\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0438\u0446\u0446\u0443, \u043a\u0430\u0441\u0441\u0438\u0440 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043a\u0430\u0437 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0435\u0433\u043e \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443. \u0414\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0441\u043a\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0442\u0435\u0441\u0442\u043e \u0438 \u043d\u0430\u0447\u0438\u043d\u044f\u044e\u0442 \u0438\u043d\u0433\u0440\u0435\u0434\u0438\u0435\u043d\u0442\u0430\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u044b\u0440\u043e\u043c, \u0442\u043e\u043c\u0430\u0442\u043d\u044b\u043c \u0441\u043e\u0443\u0441\u043e\u043c \u0438 \u043f\u0435\u043f\u043f\u0435\u0440\u043e\u043d\u0438. \u0412\u0441\u0435 \u044d\u0442\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0438\u0434\u0443\u0442 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u2014 \u0441\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f. \u0422\u0430\u043a\u0436\u0435 \u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u043e\u043a \u0433\u043e\u0434\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u043e\u043a \u0438 \u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0439 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u00ab\u0441\u043a\u043b\u0430\u0434\u0441\u043a\u0438\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0438\u00bb. \u042d\u0442\u043e \u043e\u0442\u0447\u0435\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u044b\u0440\u044c\u044f \u043d\u0430 \u0431\u0430\u043b\u0430\u043d\u0441\u0435 \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u0412\u0441\u0451 \u044d\u0442\u043e \u00ab\u0440\u0430\u0441\u0447\u0435\u0442\u043d\u044b\u0439 \u043e\u0441\u0442\u0430\u0442\u043e\u043a\u00bb. \u041d\u043e \u0435\u0441\u0442\u044c \u00ab\u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00bb \u2014 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u044b\u0440\u044c\u044f \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430 \u0441\u043a\u043b\u0430\u0434\u0435.<\/p>\n<h4>\u0420\u0435\u0432\u0438\u0437\u0438\u0438<\/h4>\n<p>  \u0414\u043b\u044f \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u043a \u0440\u0430\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u00ab\u0440\u0435\u0432\u0438\u0437\u0438\u0438\u00bb (\u0435\u0449\u0451 \u0438\u0445 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u00ab\u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438\u00bb).\u00a0<\/p>\n<p>  \u0420\u0435\u0432\u0438\u0437\u0438\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0442\u043e\u0447\u043d\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u044b\u0440\u044c\u044f \u0434\u043b\u044f \u0437\u0430\u043a\u0443\u043f\u043e\u043a. \u0421\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0437\u0430\u043a\u0443\u043f\u043e\u043a \u0437\u0430\u043c\u043e\u0440\u043e\u0437\u0438\u0442 \u043e\u0431\u043e\u0440\u043e\u0442\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430, \u0438 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0451\u0442 \u0440\u0438\u0441\u043a \u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u0437\u043b\u0438\u0448\u043a\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432, \u0447\u0442\u043e \u0442\u043e\u0436\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043f\u043e\u0442\u0435\u0440\u044f\u043c. \u041e\u043f\u0430\u0441\u0435\u043d \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043b\u0438\u0448\u0435\u043a \u0441\u044b\u0440\u044c\u044f, \u043d\u043e \u0438 \u0435\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u2014 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044e \u0432\u044b\u0440\u0443\u0447\u043a\u0438. \u0420\u0435\u0432\u0438\u0437\u0438\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0432\u0438\u0434\u0435\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0431\u044b\u043b\u0438 \u043d\u0435\u0434\u043e\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0431\u0438\u0437\u043d\u0435\u0441 \u0438\u0437-\u0437\u0430 \u0443\u0447\u0442\u0451\u043d\u043d\u044b\u0445 \u0438 \u043d\u0435\u0443\u0447\u0442\u0451\u043d\u043d\u044b\u0445 \u043f\u043e\u0442\u0435\u0440\u044c \u0441\u044b\u0440\u044c\u044f, \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435\u043c \u0438\u0437\u0434\u0435\u0440\u0436\u0435\u043a.<\/p>\n<p>  \u0420\u0435\u0432\u0438\u0437\u0438\u0438 \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u0441\u0432\u043e\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043e\u0442\u0447\u0451\u0442\u043e\u0432.<\/p>\n<h4>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0440\u0435\u0432\u0438\u0437\u0438\u0439, \u0438\u043b\u0438 \u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441\u0442\u0430\u0440\u044b\u0435 \u0440\u0435\u0432\u0438\u0437\u0438\u0438<\/h4>\n<p>  \u0420\u0435\u0432\u0438\u0437\u0438\u0438 \u2014 \u0442\u0440\u0443\u0434\u043e\u0435\u043c\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u041e\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u044d\u0442\u0430\u043f\u043e\u0432: \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u0438 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432 \u0441\u044b\u0440\u044c\u044f, \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0441\u044b\u0440\u044c\u044f \u043f\u043e \u0437\u043e\u043d\u0430\u043c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 Dodo IS.<\/p>\n<p>  \u0420\u0430\u043d\u044c\u0448\u0435 \u0440\u0435\u0432\u0438\u0437\u0438\u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0443\u0447\u043a\u0438 \u0438 \u0431\u0443\u043c\u0430\u0436\u043d\u043e\u0433\u043e \u0431\u043b\u0430\u043d\u043a\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u044b\u043b \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0441\u044b\u0440\u044c\u044f. \u041f\u0440\u0438 \u0440\u0443\u0447\u043d\u043e\u043c \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0441\u0432\u0435\u0440\u043a\u0435 \u0438 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043d\u0438\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432 Dodo IS \u0435\u0441\u0442\u044c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443. \u0412 \u043f\u043e\u043b\u043d\u043e\u0439 \u0440\u0435\u0432\u0438\u0437\u0438\u0438 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 100 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0439 \u0441\u044b\u0440\u044c\u044f, \u0430 \u0441\u0430\u043c \u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0437\u0434\u043d\u0438\u043c \u0432\u0435\u0447\u0435\u0440\u043e\u043c \u0438\u043b\u0438 \u0440\u0430\u043d\u043d\u0438\u043c \u0443\u0442\u0440\u043e\u043c, \u043e\u0442 \u0447\u0435\u0433\u043e \u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0440\u0430\u0434\u0430\u0442\u044c.<\/p>\n<h4>\u041a\u0430\u043a \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443<\/h4>\n<p>  \u041d\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u00abGame of Threads\u00bb \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c \u0443\u0447\u0435\u0442\u0430 \u0432 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u044f\u0445. \u041c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u00ab\u043f\u043b\u0430\u043d\u0448\u0435\u0442 \u0440\u0435\u0432\u0438\u0437\u043e\u0440\u0430\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0435\u0432\u0438\u0437\u0438\u0439 \u0432 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u044f\u0445. \u0412\u0441\u0451 \u0440\u0435\u0448\u0438\u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 Dodo IS, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0443\u0447\u0435\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0435 \u0441\u0442\u0440\u0430\u043d\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f, \u043d\u0435 \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u044f \u043a \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f\u043c.<\/p>\n<p>  \u0415\u0449\u0451 \u0434\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u043c\u044b \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u043b\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c DDD \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0443\u0436\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438 \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b \u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u00ab<a href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/485098\/\">\u043a\u0430\u0441\u0441\u0430 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438<\/a>\u00bb.<\/p>\n<p>  \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u0445 DDD, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0438 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435: \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430\u0445, \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445, \u0434\u043e\u043c\u0435\u043d\u043d\u044b\u0445 \u044d\u0432\u0435\u043d\u0442\u0430\u0445, \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0439 \u0441\u043b\u0443\u0436\u0431\u0435 \u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u0432. \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0438 \u043e\u0441\u043d\u043e\u0432\u044b DDD \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c, \u0438\u043d\u0430\u0447\u0435 \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0434\u043b\u0438\u043d\u043d\u043e\u0439. \u041e\u0431 \u044d\u0442\u043e\u043c \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u0432 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u00ab<a href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/489352\/\">\u0427\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u043e Domain Driven Design \u0437\u0430 10 \u043c\u0438\u043d\u0443\u0442?<\/a>\u00bb<\/p>\n<h4>\u041d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0440\u0435\u0432\u0438\u0437\u0438\u0439<\/h4>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0440\u0435\u0432\u0438\u0437\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f <b>\u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0440\u0435\u0432\u0438\u0437\u0438\u0438<\/b>. \u0418\u0445 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0440\u043e\u043b\u044c \u00ab\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043e\u0444\u0438\u0441\u0430\u00bb. \u0428\u0430\u0431\u043b\u043e\u043d \u0440\u0435\u0432\u0438\u0437\u0438\u0438 \u2014 \u044d\u0442\u043e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c InventoryTemplate. \u041e\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u044f:<\/p>\n<ul>\n<li>\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u0430;  <\/li>\n<li>\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u0438;  <\/li>\n<li>\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430;  <\/li>\n<li>\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0440\u0435\u0432\u0438\u0437\u0438\u0438: \u043c\u0435\u0441\u044f\u0447\u043d\u0430\u044f, \u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0430\u044f, \u0434\u043d\u0435\u0432\u043d\u0430\u044f;  <\/li>\n<li>\u0435\u0434\u0438\u043d\u0438\u0446\u044b \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f;  <\/li>\n<li>\u0437\u043e\u043d\u044b \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u0441\u044b\u0440\u044c\u0451 \u0432 \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f\u00a0  <\/li>\n<\/ul>\n<p>  \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d CRUD-\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043d\u0430 \u043d\u0435\u0439 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<\/p>\n<p>  \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0443 \u0440\u0435\u0432\u0438\u0437\u043e\u0440\u0430 \u0435\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432, \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0447\u0430\u0442\u044c <b>\u0440\u0435\u0432\u0438\u0437\u0438\u044e<\/b>. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043a\u043e\u0433\u0434\u0430 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u0430. \u0412 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043a\u0430\u0437\u043e\u0432 \u043d\u0435\u0442 \u0438 \u0441\u044b\u0440\u044c\u0451 \u043d\u0435 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u2014 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043e\u0441\u0442\u0430\u0442\u043a\u0430\u043c.<\/p>\n<p>  \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0440\u0435\u0432\u0438\u0437\u0438\u044e \u0440\u0435\u0432\u0438\u0437\u043e\u0440 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0437\u043e\u043d\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0445\u043e\u043b\u043e\u0434\u0438\u043b\u044c\u043d\u0438\u043a, \u0438 \u0438\u0434\u0451\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u044b\u0440\u044c\u0451 \u0442\u0430\u043c. \u0412 \u0445\u043e\u043b\u043e\u0434\u0438\u043b\u044c\u043d\u0438\u043a\u0435 \u043e\u043d \u0432\u0438\u0434\u0438\u0442 5 \u043f\u0430\u0447\u0435\u043a \u0441\u044b\u0440\u0430 \u043f\u043e 10 \u043a\u0433, \u0432\u0432\u043e\u0434\u0438\u0442 \u0432 \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 10 \u043a\u0433 * 5, \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u00ab\u0412\u0432\u0435\u0441\u0442\u0438 \u0435\u0449\u0451\u00bb. \u0417\u0430\u0442\u0435\u043c \u0437\u0430\u043c\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u043f\u043e\u043b\u043a\u0435 \u0435\u0449\u0451 2 \u043f\u0430\u0447\u043a\u0438, \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u00ab\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c\u00bb. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c 2 \u0437\u0430\u043c\u0435\u0440\u0430 \u2014 \u043f\u043e 50 \u0438 20 \u043a\u0433.<\/p>\n<p>  <b>\u0417\u0430\u043c\u0435\u0440\u043e\u043c<\/b> \u043c\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u044b\u0440\u044c\u044f \u0440\u0435\u0432\u0438\u0437\u043e\u0440\u043e\u043c \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0437\u043e\u043d\u0435, \u043d\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e\u0435. \u0420\u0435\u0432\u0438\u0437\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0432\u0432\u0435\u0441\u0442\u0438 \u0434\u0432\u0430 \u0437\u0430\u043c\u0435\u0440\u0430 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043a\u0438\u043b\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0432\u0430 \u043a\u0438\u043b\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432 \u043e\u0434\u043d\u043e\u043c \u0437\u0430\u043c\u0435\u0440\u0435 \u2014 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u044b\u043c\u0438. \u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u0430\u043c\u043e\u043c\u0443 \u0440\u0435\u0432\u0438\u0437\u043e\u0440\u0443 \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/pg\/64\/tq\/pg64tqq81deauedozaysjzt5xd4.png\"><br \/>  <i>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0430.<\/i><\/p>\n<p>  \u0422\u0430\u043a, \u043f\u043e \u0448\u0430\u0433\u0430\u043c, \u0440\u0435\u0432\u0438\u0437\u043e\u0440 \u0437\u0430 1-2 \u0447\u0430\u0441\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0432\u0441\u0451 \u0441\u044b\u0440\u044c\u0451, \u0430 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0440\u0435\u0432\u0438\u0437\u0438\u044e.<\/p>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439:<\/p>\n<ul>\n<li>\u0440\u0435\u0432\u0438\u0437\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0435\u0432\u0438\u0437\u0438\u044e;  <\/li>\n<li>\u0440\u0435\u0432\u0438\u0437\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043c\u0435\u0440\u044b \u0432 \u043d\u0430\u0447\u0430\u0442\u043e\u0439 \u0440\u0435\u0432\u0438\u0437\u0438\u0438;  <\/li>\n<li>\u0440\u0435\u0432\u0438\u0437\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u0432\u0438\u0437\u0438\u044e.  <\/li>\n<\/ul>\n<p>  \u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<h2>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430, \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438<\/h2>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0445\u043e\u0434\u044f\u0442 \u0432 \u043d\u0430\u0431\u043e\u0440 \u0442\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 DDD. \u041a \u043d\u0438\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<h4>\u0422\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b DDD<\/h4>\n<p>  <b>\u0410\u0433\u0440\u0435\u0433\u0430\u0442 <\/b>\u2014 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u2014 \u0435\u0434\u0438\u043d\u043e\u0435 \u0446\u0435\u043b\u043e\u0435 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u041a\u0430\u0436\u0434\u044b\u0439 \u0430\u0433\u0440\u0435\u0433\u0430\u0442 \u0438\u043c\u0435\u0435\u0442 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c. \u0410\u0433\u0440\u0435\u0433\u0430\u0442\u044b \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438. \u041e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>  <b>\u0413\u0440\u0430\u043d\u0438\u0446\u0430 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430<\/b> \u2014 \u043d\u0430\u0431\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u044b \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438: \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u044b \u0432\u0441\u0435 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<p>  <b>\u0418\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b<\/b> \u2014 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0432\u044b\u043c\u0438.<\/p>\n<p>  <b>\u041a\u043e\u043c\u0430\u043d\u0434\u0430<\/b> \u2014 \u044d\u0442\u043e \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0430\u0434 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u043c. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430, \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043e\u0434\u043d\u043e \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438.<\/p>\n<p>  <b>\u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438<\/b> \u2014 \u044d\u0442\u043e \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430, \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438. \u0410\u0433\u0440\u0435\u0433\u0430\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c: \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b \u0437\u0434\u0435\u0441\u044c \u0438 \u0441\u0435\u0439\u0447\u0430\u0441. \u0418\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0441\u0447\u0435\u0442\u0435 \u2014 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u0441\u044f, \u043d\u043e \u043d\u0435 \u0437\u0434\u0435\u0441\u044c \u0438 \u0441\u0435\u0439\u0447\u0430\u0441, \u0430 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043c\u043d\u043e\u0433\u0438\u0445 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432: \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u044d\u0442\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0441\u0435\u0442\u044c.<\/p>\n<p>  <b>\u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442<\/b> \u2014 \u044d\u0442\u043e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0441 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c. \u0414\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0446\u0435\u043b\u043e\u0433\u043e \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430. \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430 \u0438 \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0432\u043e\u0439 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.<\/p>\n<h4>\u041a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f<\/h4>\n<p>  \u041e\u043f\u0438\u0448\u0435\u043c \u0431\u0438\u0437\u043d\u0435\u0441-\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439. \u041a\u043e\u043c\u0430\u043d\u0434\u044b \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e DTO \u0441 \u043e\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438.<\/p>\n<p>  \u0412 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u00ab\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0440\u0430\u00bb \u0435\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u044f:<\/p>\n<ul>\n<li>\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0440\u0430 \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u044b\u0440\u044c\u044f \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0435\u0434\u0438\u043d\u0438\u0446\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c null, \u0435\u0441\u043b\u0438 \u0437\u0430\u043c\u0435\u0440 \u0443\u0434\u0430\u043b\u0438\u043b\u0438;  <\/li>\n<li>\u0432\u0435\u0440\u0441\u0438\u044f \u2014 \u0437\u0430\u043c\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f;  <\/li>\n<li>\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u044b\u0440\u044c\u044f;  <\/li>\n<li>\u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f: \u043a\u0433\/\u0433, \u043b\/\u043c\u043b, \u0448\u0442\u0443\u043a\u0438;  <\/li>\n<li>\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u043e\u043d\u044b \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f.  <\/li>\n<\/ul>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0440\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">public sealed class AddMeasurementCommand {     \/\/ ctor      public double? Value { get; }     public int Version { get; }     public UUId MaterialTypeId { get; }     public UUId MeasurementId { get; }     public UnitOfMeasure UnitOfMeasure { get; }     public UUId InventoryZoneId { get; } }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u044d\u0442\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434. \u041c\u044b \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c <code>IPublicInventoryEvent<\/code> \u2014 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0430\u043c \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c\u0438 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c.<\/p>\n<p>  \u0412 \u0441\u043e\u0431\u044b\u0442\u0438\u0438 \u00ab\u0437\u0430\u043c\u0435\u0440\u00bb \u043f\u043e\u043b\u044f \u0442\u0430\u043a\u0438\u0435 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u00ab\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0440\u0430\u00bb, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u0442 \u0435\u0449\u0451 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0438 \u0435\u0433\u043e \u0432\u0435\u0440\u0441\u0438\u044e.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u00ab\u0437\u0430\u043c\u0435\u0440\u00bb<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">public class MeasurementEvent : IPublicInventoryEvent {     public UUId MaterialTypeId { get; set; }     public double? Value { get; set; } \t     public UUId MeasurementId { get; set; }     public int MeasurementVersion { get; set; }     public UUId AggregateId { get; set; }     public int Version { get; set; }     public UnitOfMeasure UnitOfMeasure { get; set; }     public UUId InventoryZoneId { get; set; } }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0433\u0440\u0435\u0433\u0430\u0442 <code>Inventory<\/code>.<\/p>\n<h4>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430 Inventory<\/h4>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ey\/yb\/uy\/eyybuyahr1qyodr8lflhif-uleg.png\"><br \/>  <i>UML \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430 Inventory.<\/i><\/p>\n<p>  \u041f\u043e\u0434\u0445\u043e\u0434 \u0442\u0430\u043a\u043e\u0439: \u043d\u0430\u0447\u0430\u043b\u043e \u0440\u0435\u0432\u0438\u0437\u0438\u0438 \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430 <code>Inventory<\/code>, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0430\u0431\u0440\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>Create<\/code> \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0440\u0435\u0432\u0438\u0437\u0438\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>StartInventoryCommand<\/code>.<\/p>\n<p>  \u041a\u0430\u0436\u0434\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043c\u0443\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 <code>changes<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c. \u0422\u0430\u043a\u0436\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0443\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0434\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u0438\u0440\u0430.<\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0430\u0433\u0440\u0435\u0433\u0430\u0442 <code>Inventory<\/code> \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0435\u0433\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.<\/p>\n<ul>\n<li>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f (<code>changes<\/code>) \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430.  <\/li>\n<li>\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>Restore<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0432\u0435\u0440\u0441\u0438\u0438, \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430 <code>Inventory<\/code>.  <\/li>\n<\/ul>\n<p>  \u042d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0434\u0435\u0438 <code>Event Sourcing<\/code> \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430. \u041e \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0434\u0435\u044e <code>Event Sourcing<\/code> \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u0436\u0435. \u0415\u0441\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0430\u044f \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0438\u0437 \u043a\u043d\u0438\u0433\u0438 \u0412\u043e\u043d \u0412\u0435\u0440\u043d\u043e\u043d\u0430:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/82\/uj\/cd\/82ujcdc3twnpmu0bcrtuuox7lbk.png\"><br \/>  <i>\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438\u0445 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f.<\/i><\/p>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>AddMeasurementCommand<\/code>. \u0420\u0435\u0432\u0438\u0437\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>FinishInventoryCommand<\/code>. \u0410\u0433\u0440\u0435\u0433\u0430\u0442 \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u0441\u0432\u043e\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 \u043c\u0443\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u0434\u043b\u044f \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0438\u0445 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432.<\/p>\n<p>  \u0412\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0430\u0433\u0440\u0435\u0433\u0430\u0442 <code>Inventory<\/code> \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0435\u0433\u043e \u0437\u0430\u043c\u0435\u0440. \u0421 \u0437\u0430\u043c\u0435\u0440\u0430\u043c\u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u2014 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0435\u0448\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f <code>When(MeasurementEvent e)<\/code>. \u0412 \u043a\u043e\u0434\u0435 \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>AddMeasurementCommand<\/code>.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430 Inventory<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">public sealed class Inventory : IEquatable&lt;Inventory&gt; {     private readonly List&lt;IInventoryEvent&gt; _changes = new List&lt;IInventoryEvent&gt;();      private readonly List&lt;InventoryMeasurement&gt; _inventoryMeasurements = new List&lt;InventoryMeasurement&gt;();      internal Inventory(UUId id, int version, UUId unitId, UUId inventoryTemplateId,         UUId startedBy, InventoryState state, DateTime startedAtUtc, DateTime? finishedAtUtc) \t         : this(id)     {         Version = version;         UnitId = unitId;         InventoryTemplateId = inventoryTemplateId;         StartedBy = startedBy;         State = state;         StartedAtUtc = startedAtUtc;         FinishedAtUtc = finishedAtUtc; \t     }      private Inventory(UUId id)     {         Id = id;         Version = 0;         State = InventoryState.Unknown;     } \t     public UUId Id { get; private set; }     public int Version { get; private set; }     public UUId UnitId { get; private set; }     public UUId InventoryTemplateId { get; private set; }     public UUId StartedBy { get; private set; }     public InventoryState State { get; private set; }     public DateTime StartedAtUtc { get; private set; }     public DateTime? FinishedAtUtc { get; private set; }     public ReadOnlyCollection&lt;IInventoryEvent&gt; Changes =&gt; _changes.AsReadOnly(); \t     public ReadOnlyCollection&lt;InventoryMeasurement&gt; Measurements =&gt; _inventoryMeasurements.AsReadOnly();      public static Inventory Restore(UUId inventoryId, IInventoryEvent[] events)     {         var inventory = new Inventory(inventoryId);         inventory.ReplayEvents(events);         return inventory;     }      public static Inventory Restore(UUId id, int version, UUId unitId, UUId inventoryTemplateId,         UUId startedBy, InventoryState state, DateTime startedAtUtc, DateTime? finishedAtUtc,         InventoryMeasurement[] measurements)     {         var inventory = new Inventory(id, version, unitId, inventoryTemplateId,             startedBy, state, startedAtUtc, finishedAtUtc);          inventory._inventoryMeasurements.AddRange(measurements);          return inventory;     }      public static Inventory Create(UUId inventoryId)     {         if (inventoryId == null)         {             throw new ArgumentNullException(nameof(inventoryId));         }          return new Inventory(inventoryId);     }      public void ReplayEvents(params IInventoryEvent[] events)     {         if (events == null)         {             throw new ArgumentNullException(nameof(events));         }          foreach (var @event in events.OrderBy(e =&gt; e.Version))         {             Mutate(@event);         }     }      public void AddMeasurement(AddMeasurementCommand command)     {         if (command == null)         {             throw new ArgumentNullException(nameof(command));         }          Apply(new MeasurementEvent         {             AggregateId = Id,             Version = Version + 1,             UnitId = UnitId,             Value = command.Value,             MeasurementVersion = command.Version,             MaterialTypeId = command.MaterialTypeId,             MeasurementId = command.MeasurementId,             UnitOfMeasure = command.UnitOfMeasure,             InventoryZoneId = command.InventoryZoneId         });     }      private void Apply(IInventoryEvent @event)     {         Mutate(@event);         _changes.Add(@event);     }      private void Mutate(IInventoryEvent @event)     {         When((dynamic) @event);         Version = @event.Version;     }      private void When(MeasurementEvent e)     {         var existMeasurement = _inventoryMeasurements.SingleOrDefault(x =&gt; x.MeasurementId == e.MeasurementId);         if (existMeasurement is null)     {         _inventoryMeasurements.Add(new InventoryMeasurement         {             Value = e.Value,             MeasurementId = e.MeasurementId,             MeasurementVersion = e.MeasurementVersion,             PreviousValue = e.PreviousValue,             MaterialTypeId = e.MaterialTypeId,             UserId = e.By,             UnitOfMeasure = e.UnitOfMeasure,             InventoryZoneId = e.InventoryZoneId         });     }     else     {         if (!existMeasurement.Value.HasValue)         {             throw new InventoryInvalidStateException(&quot;Change removed measurement&quot;);         }          if (existMeasurement.MeasurementVersion == e.MeasurementVersion - 1)         {             existMeasurement.Value = e.Value;             existMeasurement.MeasurementVersion = e.MeasurementVersion;             existMeasurement.UnitOfMeasure = e.UnitOfMeasure;             existMeasurement.InventoryZoneId = e.InventoryZoneId;         }         else if (existMeasurement.MeasurementVersion &lt; e.MeasurementVersion)         {             throw new MeasurementConcurrencyException(Id, e.MeasurementId, e.Value);         }         else if (existMeasurement.MeasurementVersion == e.MeasurementVersion &amp;&amp;             existMeasurement.Value != e.Value)         {             throw new MeasurementConcurrencyException(Id, e.MeasurementId, e.Value);         }         else         {             throw new NotChangeException();         }     } }  \/\/ Equals \/\/ GetHashCode }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u00ab\u041f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d \u0437\u0430\u043c\u0435\u0440\u00bb \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0437\u0430\u043c\u0435\u0440\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c. \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435\u0442 \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0437\u0430\u043c\u0435\u0440.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u2014 \u043d\u0443\u0436\u043d\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:<\/p>\n<ul>\n<li>\u043d\u0435\u043b\u044c\u0437\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0437\u0430\u043c\u0435\u0440;  <\/li>\n<li>\u0432\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439.  <\/li>\n<\/ul>\n<p>  \u0415\u0441\u043b\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u2014 \u043c\u043e\u0436\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0434\u043b\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0437\u0430\u043c\u0435\u0440\u0430. \u0415\u0441\u043b\u0438 \u0432\u0435\u0440\u0441\u0438\u044f \u043c\u0435\u043d\u044c\u0448\u0435, \u0442\u043e \u044d\u0442\u043e \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 <code>MeasurementConcurrencyException<\/code>. \u0415\u0441\u043b\u0438 \u0432\u0435\u0440\u0441\u0438\u044f \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f, \u0442\u043e \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f. \u041d\u0443 \u0438 \u0435\u0441\u043b\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u043a\u0430\u043a \u0432\u0435\u0440\u0441\u0438\u044f, \u0442\u0430\u043a \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e. \u0422\u0430\u043a\u0438\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442.<\/p>\n<p>  \u0421\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u00ab\u0437\u0430\u043c\u0435\u0440\u00bb \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u0436\u0435 \u043f\u043e\u043b\u044f, \u0447\u0442\u043e \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u00ab\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0440\u0430\u00bb.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u00ab\u0437\u0430\u043c\u0435\u0440\u00bb<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">public class InventoryMeasurement {     public UUId MeasurementId { get; set; }     public UUId MaterialTypeId { get; set; }     public UUId UserId { get; set; } \u00a0   public double? Value { get; set; }  \u00a0  \u00a0public int MeasurementVersion { get; set; }  \u00a0\u00a0  public UnitOfMeasure UnitOfMeasure { get; set; }  \u00a0\u00a0  public UUId InventoryZoneId { get; set; } }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430 \u0445\u043e\u0440\u043e\u0448\u043e \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442 Unit-\u0442\u0435\u0441\u0442\u044b.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u044e\u043d\u0438\u0442 \u0442\u0435\u0441\u0442\u0430 \u00ab\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0435\u0432\u0438\u0437\u0438\u0438\u00bb<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">[Fact] public void WhenAddMeasurementAfterStartInventory_ThenInventoryHaveOneMeasurement() {     var inventoryId = UUId.NewUUId();     var inventory = Domain.Inventories.Entities.Inventory.Create(inventoryId);     var unitId = UUId.NewUUId();     inventory.StartInventory(Create.StartInventoryCommand()         .WithUnitId(unitId)         .Please());      var materialTypeId = UUId.NewUUId();     var measurementId = UUId.NewUUId();     var measurementVersion = 1;     var value = 500;     var cmd = Create.AddMeasurementCommand()         .WithMaterialTypeId(materialTypeId)         .WithMeasurement(measurementId, measurementVersion)         .WithValue(value)         .Please();     inventory.AddMeasurement(cmd);      inventory.Measurements.Should().BeEquivalentTo(new InventoryMeasurement     {         MaterialTypeId = materialTypeId,         MeasurementId = measurementId,         MeasurementVersion = measurementVersion,         Value = value,         UnitOfMeasure = UnitOfMeasure.Quantity     }); }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<h4>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435: \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0430\u0433\u0440\u0435\u0433\u0430\u0442 Inventory<\/h4>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/pg\/dh\/jc\/pgdhjceom3tu9flhyfcf0fayha4.png\"><br \/>  <i>\u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430 Inventory \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b Finish Inventory.<\/i><\/p>\n<p>  \u041d\u0430 \u0441\u0445\u0435\u043c\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>FinishInventoryCommand<\/code>. \u041f\u0435\u0440\u0435\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430 <code>Inventory<\/code> \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u044b \u043d\u0430\u0434 \u0434\u0430\u043d\u043d\u044b\u043c \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u043c, \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u043c \u0438\u0445 (\u043f. 1).\u00a0<\/p>\n<p>  \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0435\u0432\u0438\u0437\u0438\u0438 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u2014 \u043d\u0430\u0447\u0430\u043b\u043e \u0440\u0435\u0432\u0438\u0437\u0438\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0445 \u0437\u0430\u043c\u0435\u0440\u043e\u0432. \u042d\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434 <code>StartInventoryCommand<\/code> \u0438 <code>AddMeasurementCommand<\/code>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u0412 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0440\u0435\u0432\u0438\u0437\u0438\u0438, \u0432\u0435\u0440\u0441\u0438\u044e \u0438 \u0442\u0435\u043b\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f.<\/p>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>FinishInventoryCommand<\/code> (\u043f. 2). \u042d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430 \u2014 \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0432\u0438\u0437\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>InProgress<\/code>, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0440\u043e\u0434\u0438\u0442 \u043d\u043e\u0432\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <code>FinishInventoryEvent<\/code> \u0432 \u0441\u043f\u0438\u0441\u043e\u043a <code>changes<\/code> (\u043f. 3).<\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f, \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432 \u0431\u0430\u0437\u0435 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c <code>FinishInventoryEvent<\/code> \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430 (\u043f. 4).<\/p>\n<p>  \u0422\u0438\u043f <code>Inventory<\/code> (\u0440\u0435\u0432\u0438\u0437\u0438\u044f) \u2014 \u0430\u0433\u0440\u0435\u0433\u0430\u0442 \u0438 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u043a \u0441\u0432\u043e\u0438\u043c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0442\u0438\u043f <code>Inventory<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430. \u0412 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430 \u0432\u0445\u043e\u0434\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0442\u0438\u043f\u0430 <code>Measurement<\/code> (\u0437\u0430\u043c\u0435\u0440), \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u0434 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u043c (<code>changes<\/code>).<\/p>\n<h4>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0439 \u0444\u0438\u0447\u0438<\/h4>\n<p>  \u041f\u043e\u0434 \u0444\u0438\u0447\u0435\u0439 \u043c\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0431\u0438\u0437\u043d\u0435\u0441-\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0444\u0438\u0447\u0443 \u00ab\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0440\u0430\u00bb. \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0438\u0447\u0438 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u043d\u044f\u0442\u0438\u0435\u043c \u00ab\u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u0430\u044f \u0441\u043b\u0443\u0436\u0431\u0430\u00bb (<code>ApplicationService<\/code>).<\/p>\n<p>  <b>\u041f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u0430\u044f \u0441\u043b\u0443\u0436\u0431\u0430<\/b> \u2014 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438. \u041f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0441\u043b\u0443\u0436\u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0442 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 ACID, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0441\u043b\u0443\u0436\u0431\u044b \u0442\u0430\u043a\u0436\u0435 \u0440\u0435\u0448\u0430\u044e\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  \u0423 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0430\u0433\u0440\u0435\u0433\u0430\u0442 <code>Inventory<\/code>. \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0439 \u0444\u0438\u0447\u0438 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0439 \u0441\u043b\u0443\u0436\u0431\u043e\u0439. \u0412 \u043d\u0435\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432\u0441\u0435\u0445 \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043c\u0438\u0440. \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0439 \u0441\u043b\u0443\u0436\u0431\u044b \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>MediatR<\/code>.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u0444\u0438\u0447\u0438 \u00ab\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0440\u0430\u00bb<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">public class AddMeasurementChangeHandler\u00a0     : IRequestHandler&lt;AddMeasurementChangeRequest, AddMeasurementChangeResponse&gt; {     \/\/ dependencies     \/\/ ctor      public async Task&lt;AddMeasurementChangeResponse&gt; Handle(         AddMeasurementChangeRequest request,         CancellationToken ct)     {         var inventory =             await _inventoryRepository.GetAsync(request.AddMeasurementChange.InventoryId, ct);         if (inventory == null)         {             throw new NotFoundException($&quot;Inventory {request.AddMeasurementChange.InventoryId} is not found&quot;);         }          var user = await _usersRepository.GetAsync(request.UserId, ct);         if (user == null)         {             throw new SecurityException();         }          var hasPermissions =         await _authPermissionService.HasPermissionsAsync(request.CountryId, request.Token, inventory.UnitId, ct);         if (!hasPermissions)         {             throw new SecurityException();         }          var unit = await _unitRepository.GetAsync(inventory.UnitId, ct);         if (unit == null)         {             throw new InvalidRequestDataException($&quot;Unit {inventory.UnitId} is not found&quot;);         }          var unitOfMeasure =  Enum.Parse&lt;UnitOfMeasure&gt;(request.AddMeasurementChange.MaterialTypeUnitOfMeasure);           var addMeasurementCommand = new AddMeasurementCommand(\t             request.AddMeasurementChange.Value,             request.AddMeasurementChange.Version,             request.AddMeasurementChange.MaterialTypeId,             request.AddMeasurementChange.Id,             unitOfMeasure,             request.AddMeasurementChange.InventoryZoneId);          inventory.AddMeasurement(addMeasurementCommand);          await HandleAsync(inventory, ct);          return new AddMeasurementChangeResponse(request.AddMeasurementChange.Id, user.Id, user.GetName());     }      private async Task HandleAsync(Domain.Inventories.Entities.Inventory inventory, CancellationToken ct)     {             await _inventoryRepository.AppendEventsAsync(inventory.Changes, ct);               try             {                 await _localQueueDataService.Publish(inventory.Changes, ct);             }             catch (Exception ex)             {                 _logger.LogError(ex, &quot;error occured while handling action&quot;);             }     } }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<h4>Event sourcing<\/h4>\n<p>  \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434 ES \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:<\/p>\n<ul>\n<li>\u0412 Dodo \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430.  <\/li>\n<li>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ES \u043f\u0440\u043e\u0449\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u0430 \u2014 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.  <\/li>\n<li>\u0415\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u0442\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a ES \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.  <\/li>\n<\/ul>\n<p>  \u0418\u0434\u0435\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430 \u2014 \u0432\u0441\u0435 \u043d\u043e\u0432\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434 \u043c\u044b \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u043c \u0438\u0445 \u043d\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0435. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043f\u0430\u0447\u043a\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043c\u044b \u0441\u043d\u0438\u043c\u0430\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u044b\u0435 N \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u0432\u0448\u0443\u044e\u0441\u044f \u0447\u0430\u0441\u0442\u044c \u0441 \u044d\u0442\u043e\u0433\u043e \u0441\u043d\u0438\u043c\u043a\u0430.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0432 Inventory<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">internal sealed class InventoryRepository : IInventoryRepository {     \/\/ dependencies     \/\/ ctor      static InventoryRepository()     {         EventTypes = typeof(IEvent)             .Assembly.GetTypes().Where(x =&gt; typeof(IEvent).IsAssignableFrom(x))             .ToDictionary(t =&gt; t.FullName, x =&gt; x);     }      public async Task AppendAsync(IReadOnlyCollection&lt;IEvent&gt; events, CancellationToken ct)     {         using (var session = await _dbSessionFactory.OpenAsync())         {             if (events.Count == 0) return;              try             {                 foreach (var @event in events)                 {                     await session.ExecuteAsync(Sql.AppendEvent,                         new                         {                             @event.AggregateId,                             @event.Version,                             @event.UnitId,                             Type = @event.GetType().FullName,                             Data = JsonConvert.SerializeObject(@event),                             CreatedDateTimeUtc = DateTime.UtcNow                         }, cancellationToken: ct);                 }             }             catch (MySqlException e)                 when (e.Number == (int) MySqlErrorCode.DuplicateKeyEntry)             {                 throw new OptimisticConcurrencyException(events.First().AggregateId, &quot;&quot;);             }         }     }      public async Task&lt;Domain.Models.Inventory&gt; GetInventoryAsync(         UUId inventoryId,         CancellationToken ct)     {         var events = await GetEventsAsync(inventoryId, 0, ct);          if (events.Any()) return Domain.Models.Inventory.Restore(inventoryId, events);          return null;     }          private async Task&lt;IEvent[]&gt; GetEventsAsync(         UUId id,         int snapshotVersion,         CancellationToken ct)     {         using (var session = await _dbSessionFactory.OpenAsync())     {             var snapshot = await GetInventorySnapshotAsync(session, inventoryId, ct);             var version = snapshot?.Version ?? 0;                      var events = await GetEventsAsync(session, inventoryId, version, ct);             if (snapshot != null)             {                 snapshot.ReplayEvents(events);                 return snapshot;             }              if (events.Any())             {                 return Domain.Inventories.Entities.Inventory.Restore(inventoryId, events);             }              return null;         }     }      private async Task&lt;Inventory&gt; GetInventorySnapshotAsync(         IDbSession session,         UUId id,         CancellationToken ct)     {         var record =             await session.QueryFirstOrDefaultAsync&lt;InventoryRecord&gt;(Sql.GetSnapshot, new {AggregateId = id},                 cancellationToken: ct);         return record == null ? null : Map(record);     }      private async Task&lt;IInventoryEvent[]&gt; GetEventsAsync(         IDbSession session,         UUId id,         int snapshotVersion,         CancellationToken ct)     {         var rows = await session.QueryAsync&lt;EventRecord&gt;(Sql.GetEvents,             new             {                 AggregateId = id,                 Version = snapshotVersion             }, cancellationToken: ct);         return rows.Select(Map).ToArray();     }      private static IEvent Map(EventRecord e)     {         var type = EventTypes[e.Type];         return (IEvent) JsonConvert.DeserializeObject(e.Data, type);     } }  internal class EventRecord {     public string Type { get; set; }     public string Data { get; set; } }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u043c\u044b \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430\u0434 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430. \u0411\u0438\u0437\u043d\u0435\u0441 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0435\u0441\u0442\u044c \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430. \u041e\u0446\u0435\u043d\u0438\u0432 \u0432\u0441\u0435 \u043f\u043b\u044e\u0441\u044b \u0438 \u043c\u0438\u043d\u0443\u0441\u044b \u043c\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u0443\u0439\u0442\u0438 \u043e\u0442 ES \u043a \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u0434\u0445\u043e\u0434\u0443 \u2014 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443 <code>Events<\/code> \u043d\u0430 <code>Inventories<\/code> \u0438 <code>Measurements<\/code>.<\/p>\n<h2>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438<\/h2>\n<p>  \u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0445\u0435\u043c\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 <code>Inventory<\/code> \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043c\u0438\u0440\u043e\u043c.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/i4\/yq\/ze\/i4yqzewwfhhtxdsqyru2a2o9lnw.png\"><br \/>  <i>\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0440\u0435\u0432\u0438\u0437\u0438\u0439 \u0441 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438. \u041d\u0430 \u0441\u0445\u0435\u043c\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u044b \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u044b, \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0438 \u0438\u0445 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443.<\/i><\/p>\n<p>  \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 <code>Auth<\/code>, <code>Inventory<\/code> \u0438 <code>Datacatalog<\/code> \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442. \u041c\u043e\u043d\u043e\u043b\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0443\u0447\u0435\u0442\u0430 \u0432 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u044f\u0445. \u041f\u043e\u043c\u0438\u043c\u043e \u0440\u0435\u0432\u0438\u0437\u0438\u0439, \u043a \u0443\u0447\u0435\u0442\u0443 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0441\u044b\u0440\u044c\u044f \u0432 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u044f\u0445: \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f, \u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f.<\/p>\n<h4>HTTP<\/h4>\n<p>  \u0421\u0435\u0440\u0432\u0438\u0441 <code>Inventory<\/code> \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 <code>Auth<\/code> \u043f\u043e HTTP. \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 <code>Auth<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0435\u043c\u0443 \u0440\u043e\u043b\u0435\u0439.<\/p>\n<ul>\n<li>\u0412 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0435\u0441\u0442\u044c \u0440\u043e\u043b\u044c \u00ab\u0440\u0435\u0432\u0438\u0437\u043e\u0440\u00bb, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0440\u0435\u0432\u0438\u0437\u0438\u0438.  <\/li>\n<li>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u044e.  <\/li>\n<li>\u041f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441 \u0440\u0435\u0432\u0438\u0437\u0438\u0439.  <\/li>\n<\/ul>\n<p>  \u041d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0435\u0441\u0442\u044c \u0442\u043e\u043a\u0435\u043d \u043e\u0442 <code>Auth<\/code>. \u0421\u0435\u0440\u0432\u0438\u0441 \u0440\u0435\u0432\u0438\u0437\u0438\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0442\u043e\u043a\u0435\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a <code>Auth<\/code> \u0437\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439. <code>Auth<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442 \u043d\u0435 \u0438\u0441\u0442\u0435\u043a\u043b\u043e \u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0442\u043e\u043a\u0435\u043d\u0430, \u0435\u0433\u043e \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0443, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e, \u0442\u043e <code>Inventory<\/code> \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432 \u043a\u0443\u043a\u0438 \u043a\u043b\u0435\u0439\u043c\u044b \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043b\u043e\u0433\u0438\u043d, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u0438 \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u043a\u0443\u043a.<\/p>\n<p>  <b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/b>. \u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 <code>Auth<\/code> \u043c\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0438 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u00ab<a href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/520046\/\">\u0422\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438: \u043e\u0431\u0437\u043e\u0440 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 OAuth 2.0<\/a>\u00bb.<\/p>\n<p>  \u0421 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 <code>Inventory<\/code> \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0440\u043e\u043a\u0435\u0440\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f RabbitMQ, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u0432\u044f\u0437\u043a\u0430 \u043d\u0430\u0434 \u043d\u0438\u043c \u2014 MassTransit.<\/p>\n<h4>RMQ: \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/h4>\n<p>  \u0421\u0435\u0440\u0432\u0438\u0441 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u2014 <code>Datacatalog<\/code> \u2014 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442 <code>Inventory<\/code> \u0432\u0441\u0435\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438: \u0441\u044b\u0440\u044c\u0435\u043c \u0434\u043b\u044f \u0443\u0447\u0435\u0442\u0430, \u0441\u0442\u0440\u0430\u043d\u0430\u043c\u0438, \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u044f\u043c\u0438.<\/p>\n<p>  \u041d\u0435 \u0432\u0434\u0430\u0432\u0430\u044f\u0441\u044c \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043e\u043f\u0438\u0448\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0438\u0434\u0435\u044e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u041d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0443\u0436\u0435 \u0432\u0441\u0451 \u0433\u043e\u0442\u043e\u0432\u043e \u0434\u043b\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0441\u044b\u0440\u044c\u044f.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f Datacatalog<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">namespace Dodo.DataCatalog.Contracts.Products.v1 {     public class MaterialType \u00a0\u00a0  { \u00a0\u00a0\u00a0\u00a0    public UUId Id { get; set; } \u00a0\u00a0\u00a0\u00a0    public int Version { get; set; } \u00a0\u00a0\u00a0\u00a0    public int CountryId { get; set; } \u00a0\u00a0\u00a0\u00a0    public UUId DepartmentId { get; set; }  \u00a0\u00a0\u00a0\u00a0    public string Name { get; set; } \u00a0\u00a0\u00a0\u00a0    public MaterialCategory Category { get; set; } \u00a0\u00a0\u00a0\u00a0    public UnitOfMeasure BasicUnitOfMeasure { get; set; } \u00a0\u00a0\u00a0\u00a0    public bool IsRemoved { get; set; }     }  \u00a0\u00a0  public enum UnitOfMeasure \u00a0\u00a0  { \u00a0\u00a0\u00a0\u00a0    Quantity = 1, \u00a0\u00a0\u00a0\u00a0    Gram = 5, \u00a0\u00a0\u00a0\u00a0    Milliliter = 7, \u00a0\u00a0\u00a0\u00a0    Meter = 8, \u00a0\u00a0  }  \u00a0\u00a0  public enum MaterialCategory \u00a0\u00a0  { \u00a0\u00a0\u00a0\u00a0    Ingredient = 1, \u00a0\u00a0\u00a0\u00a0    SemiFinishedProduct = 2, \u00a0\u00a0\u00a0\u00a0    FinishedProduct = 3, \u00a0\u00a0\u00a0\u00a0    Inventory = 4, \u00a0\u00a0\u00a0\u00a0    Packaging = 5, \u00a0\u00a0\u00a0\u00a0    Consumables = 6 \u00a0\u00a0  } }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u042d\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442\u0441\u044f \u0432 <code>exchange<\/code>. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0441\u0432\u044f\u0437\u043a\u0443 <code>exchange-queue<\/code> \u0434\u043b\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/b4\/i8\/ae\/b4i8ae1s4xh2i5alu08cjytybxk.png\"><br \/>  <i>\u0421\u0445\u0435\u043c\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 \u0435\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b RMQ.<\/i><\/p>\n<p>  \u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0435\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u0441\u0435\u0440\u0432\u0438\u0441. \u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0437 Datacatalog<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">public class MaterialTypeConsumer : IConsumer&lt;Dodo.DataCatalog.Contracts.Products.v1.MaterialType&gt; { \u00a0\u00a0  private readonly IMaterialTypeRepository _materialTypeRepository;  \u00a0\u00a0  public MaterialTypeConsumer(IMaterialTypeRepository materialTypeRepository) \u00a0\u00a0  { \u00a0\u00a0\u00a0\u00a0\u00a0    _materialTypeRepository = materialTypeRepository; \u00a0\u00a0  } \u00a0 \u00a0\u00a0  public async Task Consume(ConsumeContext&lt;Dodo.DataCatalog.Contracts.Products.v1.MaterialType&gt; context) \u00a0\u00a0  { \u00a0\u00a0\u00a0\u00a0    var materialType = new AddMaterialType(context.Message.Id, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    context.Message.Name, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    (int)context.Message.Category, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    (int)context.Message.BasicUnitOfMeasure, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    context.Message.CountryId, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    context.Message.DepartmentId, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    context.Message.IsRemoved, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    context.Message.Version); \u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0    await _materialTypeRepository.SaveAsync(materialType, context.CancellationToken); \u00a0\u00a0  } }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<h4>RMQ: \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/h4>\n<p>  \u0427\u0430\u0441\u0442\u044c \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0443\u0447\u0451\u0442, \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 <code>Inventory<\/code> \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0435\u0432\u0438\u0437\u0438\u0439. \u0412\u0441\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0443\u0432\u0435\u0434\u043e\u043c\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u043c\u044b \u043f\u043e\u043c\u0435\u0447\u0430\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c <code>IPublicInventoryEvent<\/code>. \u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430, \u043c\u044b \u0438\u0445 \u0432\u044b\u0447\u043b\u0435\u043d\u044f\u0435\u043c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 (<code>changes<\/code>) \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0432\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b <code>publicqueue<\/code> \u0438 <code>publicqueue_archive<\/code>.<\/p>\n<p>  \u0414\u043b\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443 \u043d\u0430\u0441 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u00ab\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u00bb, \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044f <code>Transactional outbox pattern<\/code>. \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430 <code>Inventory<\/code> \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0431\u0440\u043e\u043a\u0435\u0440\u0443.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u0442\u043e \u043e\u043d\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 <code>publicqueue<\/code>. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u043d\u044f\u0442\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0434\u043d\u0435\u0435. \u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0438 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430 \u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u044e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0422\u0430\u0431\u043b\u0438\u0446\u0430 <code>publicqueue_archive<\/code> \u0432\u0435\u0447\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0431\u0440\u043e\u043a\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">internal sealed class BusDataService : IBusDataService { \u00a0\u00a0  private readonly IPublisherControl _publisherControl; \u00a0\u00a0  private readonly IPublicQueueRepository _repository; \u00a0\u00a0  private readonly EventMapper _eventMapper;  \u00a0\u00a0  public BusDataService( \u00a0\u00a0\u00a0\u00a0    IPublicQueueRepository repository, \u00a0\u00a0\u00a0\u00a0    IPublisherControl publisherControl, \u00a0\u00a0\u00a0\u00a0    EventMapper eventMapper) \u00a0\u00a0  { \u00a0\u00a0\u00a0\u00a0    _repository = repository; \u00a0\u00a0\u00a0\u00a0    _publisherControl = publisherControl; \u00a0\u00a0\u00a0\u00a0    _eventMapper = eventMapper; \u00a0\u00a0  }    \u00a0\u00a0public async Task ConsumePublicQueueAsync(int batchEventSize, CancellationToken cancellationToken) \u00a0\u00a0  { \u00a0\u00a0\u00a0\u00a0    var events = await _repository.GetAsync(batchEventSize, cancellationToken); \u00a0\u00a0\u00a0\u00a0    await Publish(events, cancellationToken); \u00a0\u00a0  }  \u00a0  \u00a0public async Task Publish(IEnumerable&lt;IPublicInventoryEvent&gt; events, CancellationToken ct) \u00a0\u00a0  { \u00a0\u00a0\u00a0\u00a0    foreach (var @event in events) \u00a0\u00a0\u00a0\u00a0    { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    var publicQueueEvent = _eventMapper.Map((dynamic) @event); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    await _publisherControl.Publish(publicQueueEvent, ct); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0    await _repository.DeleteAsync(@event, ct); \u00a0\u00a0\u00a0  \u00a0\u00a0}   \u00a0\u00a0} }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0421\u043e\u0431\u044b\u0442\u0438\u044f \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0443 \u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u043b\u044f \u043e\u0442\u0447\u0435\u0442\u043e\u0432. \u041e\u0442\u0447\u0435\u0442 \u00ab\u043f\u043e\u0442\u0435\u0440\u0438 \u0438 \u0438\u0437\u0431\u044b\u0442\u043e\u043a\u00bb \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0434\u0432\u0435 \u043b\u044e\u0431\u044b\u0435 \u0440\u0435\u0432\u0438\u0437\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439. \u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e, \u0435\u0441\u0442\u044c \u0432\u0430\u0436\u043d\u044b\u0439 \u043e\u0442\u0447\u0435\u0442 \u00ab\u0441\u043a\u043b\u0430\u0434\u0441\u043a\u0438\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0438\u00bb, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0440\u0430\u043d\u0435\u0435.\u00a0<\/p>\n<p>  \u0417\u0430\u0447\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0443 \u0434\u0430\u043d\u043d\u044b\u0445? \u0412\u0441\u0435 \u0442\u0430\u043a\u0436\u0435 \u2014 \u0434\u043b\u044f \u043e\u0442\u0447\u0435\u0442\u043e\u0432, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043d\u043e\u0432\u044b\u0445 \u0440\u0435\u043b\u044c\u0441\u0430\u0445. \u0420\u0430\u043d\u044c\u0448\u0435 \u0432\u0441\u0435 \u043e\u0442\u0447\u0435\u0442\u044b \u0436\u0438\u043b\u0438 \u0432 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0435, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0445 \u0432\u044b\u043d\u043e\u0441\u044f\u0442. \u042d\u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442 \u0434\u0432\u0435 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u2014 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445: OLTP \u0438 OLAP. \u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u043a\u0430\u043a \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0442\u0430\u043a \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044f \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u043c Domain-Driven Design, \u043d\u0430\u043c \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u0443\u044e \u0438 \u0433\u0438\u0431\u043a\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044f\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u0423 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u043d\u043e \u0438 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0438 \u0432 \u0432\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043d\u0430\u0439\u0434\u0451\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Domain-Driven Design.<\/p>\n<blockquote><p>\u0411\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e DDD \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 <a href=\"https:\/\/t.me\/dddevotion\">DDDevotion<\/a> \u0438 \u043d\u0430 Youtube-\u043a\u0430\u043d\u0430\u043b\u0435 <a href=\"https:\/\/www.youtube.com\/dddevotion\">DDDevotion<\/a>. \u041e\u0431\u0441\u0443\u0434\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u0432 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u0432 <a href=\"https:\/\/t.me\/dododevchat\">Dodo Engineering chat<\/a>.<\/p><\/blockquote>\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\/company\/dododev\/blog\/523540\/\"> https:\/\/habr.com\/ru\/company\/dododev\/blog\/523540\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/523540\/\">\u0412 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u044f\u0445 \u0432\u0430\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0443\u0447\u0451\u0442\u0430 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0430\u0441\u0430\u043c\u0438. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0443\u0436\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0442\u0435\u0440\u044f\u0442\u044c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b, \u043d\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043a\u0443\u043f\u043a\u0438 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0441\u044f\u0446. \u0412\u0430\u0436\u043d\u0430\u044f \u0440\u043e\u043b\u044c \u0432 \u0443\u0447\u0451\u0442\u0435 \u0443 \u0440\u0435\u0432\u0438\u0437\u0438\u0439. \u041e\u043d\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0438 \u0441\u0432\u0435\u0440\u044f\u0442\u044c \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u0442\u043e, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/nw\/w_\/hl\/nww_hlga61qdf3xe-mnjjpe7xus.png\"><\/p>\n<p>  \u0420\u0435\u0432\u0438\u0437\u0438\u044f \u0432 \u0414\u043e\u0434\u043e \u043d\u0435 \u0431\u0443\u043c\u0430\u0436\u043d\u0430\u044f: \u0443 \u0440\u0435\u0432\u0438\u0437\u043e\u0440\u0430 \u0435\u0441\u0442\u044c \u043f\u043b\u0430\u043d\u0448\u0435\u0442, \u0433\u0434\u0435 \u0440\u0435\u0432\u0438\u0437\u043e\u0440 \u043e\u0442\u043c\u0435\u0447\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043e\u0442\u0447\u0435\u0442\u044b. \u041d\u043e \u0434\u043e 2020 \u0433\u043e\u0434\u0430 \u0432 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u044f\u0445 \u0440\u0435\u0432\u0438\u0437\u0438\u044f \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0431\u0443\u043c\u0430\u0436\u043a\u0430\u0445 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043a \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0449\u0435 \u0438 \u043b\u0435\u0433\u0447\u0435. \u042d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u043e \u043a \u043d\u0435\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c, \u043e\u0448\u0438\u0431\u043a\u0430\u043c \u0438 \u043f\u043e\u0442\u0435\u0440\u044f\u043c, \u2014 \u043b\u044e\u0434\u0438 \u043e\u0448\u0438\u0431\u0430\u044e\u0442\u0441\u044f, \u0431\u0443\u043c\u0430\u0436\u043a\u0438 \u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f, \u0430 \u0435\u0449\u0451 \u0438\u0445 \u043c\u043d\u043e\u0433\u043e. \u041c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0438 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043f\u043b\u0430\u043d\u0448\u0435\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431. \u0412 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c DDD. \u041a\u0430\u043a \u0443 \u043d\u0430\u0441 \u044d\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-311543","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/311543","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=311543"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/311543\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=311543"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=311543"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=311543"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}