рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдореЗрдВ рдХреЛрдб рдХрд╛ рд╕рдВрдЧрдарди рдФрд░ рд╣реЗрдХреНрд╕рд╛рдЧреЛрдирд▓ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рдбреАрдбреАрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг


рд╣реЗрд▓реЛ, рд╣реЗрдмреНрд░! рдореЛрдиреЛрд▓рд┐рде рдореЗрдВ, рд╕рднреА рдХреЛрдб рдПрдХ рд╣реА рд╢реИрд▓реА рдореЗрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдореЗрдВ рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдФрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред 1 рд╕реЗ 2 рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдФрд░ 1 рд╕реЗ 10 рдХреНрд░рд┐рдпрд╛рдУрдВ рд╡рд╛рд▓реЗ рд╕рд░рд▓ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдХреЗ рд▓рд┐рдП, рдЕрдореВрд░реНрдд рдкрд░рддреЛрдВ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЕрд░реНрде рдирд╣реАрдВ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ microservices рдХреЗ рд▓рд┐рдП рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдХреЗ рддрд░реНрдХ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╢реБрд░реВ рдореЗрдВ рдЖрд▓рд╕реА рдирд╣реАрдВ рд╣реЛрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдореИрдВ рдХреЛрдб рдХреЗ рдЖрдпреЛрдЬрди рдФрд░ рдбреАрдбреАрдбреА, рдкреЛрд░реНрдЯреНрд╕ рдФрд░ рдПрдбрд╛рдкреНрдЯрд░реНрд╕ рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд▓реЗрдЦ рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рд╛рд░рд╛рдВрд╢ рд╣реИ: рдЬреВрди - рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реИред рдордзреНрдп - рд╕рд╛рд░ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд▓рд┐рдЦрддрд╛ рд╣реИред рд╡рд░рд┐рд╖реНрда - рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдХреЛрдб рдХрдм рд▓рд┐рдЦрдирд╛ рд╣реИ, рдФрд░ рдХрдм рд╕рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредрдпрд╣рд╛рдВ рдЖрдкрдХреЛ рддреБрд░рдВрдд I рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - C # рдореЗрдВ рдкреЛрд░реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпрд╛ рд╕рд╛рд░ рд╣реИрдВ, рдФрд░ рдПрдбреЗрдкреНрдЯрд░ рдХрдВрдХреНрд░реАрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рд╡рд░реНрдЧ, рд╕рдВрд░рдЪрдирд╛) рд╣реИрдВред рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдореИрдВ рдбреАрдбреАрдбреА, рд╣реЗрдХреНрд╕рд╛рдЧреЛрдирд▓, рдкреНрдпрд╛рдЬ, рд╕реНрд╡рдЪреНрдЫ, рд╕реАрдХреНрдпреВрдЖрд░рдПрд╕ рдХреЗ рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ ... рдХреИрд╕реЗ рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рд╕рд╛рде рд░рдЦрд╛ рдФрд░ рдХреНрд▓реАрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рдЧрд▓рдд рдзрд╛рд░рдгрд╛ рдХрд╛ рдпрд╣ рд▓реЗрдЦ ред рдпрд╣рд╛рдВ, рдмрд╕ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рдмрдбрд╝реЗ рдФрд░ рдЬрдЯрд┐рд▓ рдореЛрдиреЛрд▓рд┐рде рдХреЗ рд▓рд┐рдП рд╡рд░реНрдгрд┐рдд рд╣реИред рдореИрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдореЗрдВ 80 рдкреНрд░рддрд┐рд╢рдд рд╕рд░рд▓ рдФрд░ 20 рдордзреНрдпрдо рдпрд╛ рдЙрдЪреНрдЪ рдЬрдЯрд┐рд▓рддрд╛ рд╡рд╛рд▓реЗ рд╣реИрдВред

рд╢рдмреНрджрд╛рд╡рд▓реА


1) рдкреНрд░рд╛рдЗрдорд░реА рдПрдбреЗрдкреНрдЯрд░


рдПрдХ рдмрд╛рд╣рд░реА рдХреЙрд▓рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдВ ред рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рджреНрд╡рд┐рддреАрдпрдХ рдПрдбреЗрдкреНрдЯрд░ рдФрд░ рд▓реЙрдЬрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╡реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХреЗ рдмрд┐рдВрджреБред рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐: рдЖрдЗрдЯрдо рд╕реЗрд╡рд╛, CreateItemCommandHandlerред рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдФрд░ рджреНрд╡рд┐рддреАрдпрдХ рдПрдбреЗрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

2) рджреНрд╡рд┐рддреАрдпрдХ рдПрдбреЗрдкреНрдЯрд░


рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдПрдХ рдмрд╛рд╣рд░реА рдирд╛рдордХ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╡рд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдХрдорд╛рдВрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐: ItemRepository, EmailSender, Logger, DistributedCacheред рд╡реЗ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП EntityFramework рдЬреИрд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдЪреМрдЦрдЯреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

3) рддрд░реНрдХ


3.1) рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ


рдбреЗрдЯрд╛ рдФрд░ рд▓реЙрдЬрд┐рдХ рдХреЛ рдорд┐рд▓рд╛рдПрдВред рд╡рд┐рд╢рд┐рд╖реНрдЯ OOP рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ред рдордж, рдзрди, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ред ValueObjects рдФрд░ рдЗрд╡реЗрдВрдЯреНрд╕ рднреА рд╣реИрдВред рдПрдВрдЯрд┐рдЯреА рд▓реЗрдпрд░ рд╕реЗ рдХреЗрд╡рд▓ рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдкрд░рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдореВрд▓ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╕рдм рдЙрд╕реА рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВред

3.2) рдбреЛрдореЗрди рд╕реЗрд╡рд╛


рдирдЧреНрди рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧред рд╡реЗ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдХрд╛рдИ рд╕реЗ рдЬреБрдбрд╝реЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗред рд╕рдВрд╕реНрдерд╛рдУрдВ рдпрд╛ рдЕрдиреНрдп DomainServices рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдХрд░реЛ PrimaryAdapters рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдФрд░ SecondaryAdapters (рд╡реЗ рд╣рдореЗрд╢рд╛ рдЦреБрдж рдХреЛ рд╕рдВрдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ)ред рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдорд╛рдЙрдВрдЯ рдХреИрдХреНрдпреВрд▓рд░, рд╡реИрд▓рд┐рдбреЗрдЯрд░ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рд╣реИред

рдХреЛрдб рдХреЙрд▓ рдкреНрд░рд╡рд╛рд╣ рд╣рдореЗрд╢рд╛ рдПрдХ рджрд┐рд╢рд╛ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдкреНрд░рд╛рдердорд┐рдХ рдПрдбрд╛рдкреНрдЯрд░ -> рддрд░реНрдХ рдФрд░ рджреНрд╡рд┐рддреАрдпрдХ рдПрдбрд╛рдкреНрдЯрд░ред

рдбреЛрдореЗрди


рдпрд╣ рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЛрдореЗрди рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдИ-рдХреЙрдорд░реНрд╕ рд╣реИред

Boundedcontext


рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЗ рд╕рд╛рде рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЕрд▓рдЧ-рдерд▓рдЧ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЙрдВрдбрдХреЙрдирдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рд╕рдлрд▓рддрд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдЕрдкрдиреЗ рд╕рднреА рдмрд╛рдЙрдВрдбреЗрдб рдХреЙрдиреНрдЯреЗрдХреН рдЯ рдХреЛ рдвреВрдВрдврдирд╛ рдФрд░ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рд╣реИред рдПрдХ microservice рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ, 1 microservice = 1 BoundedContextред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдПрдХ рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдореЗрдВ рдПрдХ рдмрд╛рдЙрдВрдбреЗрдб рдХреЛрдВрдЯреЗрдХреНрд╕реНрдЯ рд╢реЙрдкрд┐рдВрдЧ рдХрд╛рд░реНрдЯ рдФрд░ рдСрд░реНрдбрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдмрд╛рдЙрдВрдбреЗрдб рдХреЛрдВрдЯреЗрдХреНрд╕реНрдЯ, рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рдЙрдВрдбреЗрдб рдХреЛрдВрдЯреЗрдХреНрд╕реНрдЯ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдПрдХ рдмрдбрд╝рд╛ рдмрд╛рдЙрдВрдбреЗрдбреЙрдирдЯреЗрдХреНрд╕реНрдЯ рдЕрдВрджрд░ рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рд▓ рдХреА рдЯреЛрдХрд░реА рдХреЗ рдмрд╛рдЙрдВрдбреЗрдб рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЯреЛрдХрд░реА рдореЗрдВ рдорд╛рд▓ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЯреЛрдХрд░реА рд╕реЗ рдорд╛рд▓ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рд╡рд┐рднрд╛рдЬрди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореЛрдиреЛрд▓рд┐рде 1 рдореЗрдВ, рдПрдХ рдмрдбрд╝рд╛ рдмрд╛рдЙрдВрдбреЗрдб рдХреЙрдирдЯреЗрдХреНрд╕реНрдЯ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реИред рдпрд╣рд╛рдВ рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╕рднреА рдПрдВрдЯрд┐рдЯреА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрджрд░реНрдн рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВ рдЕрд░реНрдерд╛рддреНредрд╡рд╕реНрддреБрдУрдВ рдХреА рдЯреЛрдХрд░реА рдХреЗ рд╕рдВрджрд░реНрдн рд╕реЗ рд╡рд╕реНрддреБ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╢реЛрдХреЗрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рд╕реЗ рдЖрдЗрдЯрдо, рдпреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░реЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдореЛрдиреЛрд▓рд┐рде рдореЗрдВ, рд╡реЗ рдмрд╕ рдПрдХ-рджреВрд╕рд░реЗ рдореЗрдВ рдореИрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдЖрдЗрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ EF рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреБрдЬрд░рддрд╛ рд╣реИ рдФрд░ рдЬрд┐рд╕рдореЗрдВ рдлрд╝реАрд▓реНрдб рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдпрджрд┐ рдЯреЛрдХрд░реА рдХреЗ рд╕рдВрджрд░реНрдн (рдореЙрдбреНрдпреВрд▓) рд╕реЗ рдЖрдЗрдЯрдо рдореЗрдВ рдЧреБрдг рд╕рдВрдкрддреНрддрд┐ 1 рд╣реИ, рдФрд░ рд╕реНрдЯреЛрд░ рдХреЗ рд╕рдВрджрд░реНрдн рд╕реЗ рдЖрдЗрдЯрдо рд╣реИ рдорд╛рд▓ рдХреА рд╕рдВрдкрддреНрддрд┐ рдкреНрд░реЙрдкрд░реНрдЯреА 2 рд╣реИ рддреЛ рдЖрдИрдЯреВрдбреЛ рдХреЗ рдкрд╛рд╕ рдкреНрд░реЙрдкрд░реНрдЯреА 1 рдФрд░ рдкреНрд░реЙрдкрд░реНрдЯреА 2 рджреЛрдиреЛрдВ рд╣реЛрдВрдЧреЗред рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рднрдВрдбрд╛рд░ рд╣реЛрдЧрд╛ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЙрд╕ рдЖрдЗрдЯрдо рдХреЛ рдЦреАрдВрдЪреЗрдЧрд╛ рдЬреЛ рдЗрд╕ рд╕рдВрджрд░реНрдн рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдореЗрдВ, рдпрд╣ рдЖрд╕рд╛рди рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрдкрдирд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдЕрдкрдирд╛ рд╕рд╛рд░ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реНрд╡ рд╕реЗрд╡рд╛ рдХреА рдЕрдкрдиреА рдХрдХреНрд╖рд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред рдХреЗрд╡рд▓рдПрдХ рдореЛрдиреЛрд▓рд┐рде рдореЗрдВ, рд╡реЗ рдмрд╕ рдПрдХ рджреВрд╕рд░реЗ рдореЗрдВ рдореИрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдЖрдЗрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ EF рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреБрдЬрд░рддрд╛ рд╣реИ рдФрд░ рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдлрд╝реАрд▓реНрдб рд╣реИрдВ рдЬреЛ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдпрджрд┐ рдЯреЛрдХрд░реА рдХреЗ рд╕рдВрджрд░реНрдн (рдореЙрдбреНрдпреВрд▓) рд╕реЗ рдЖрдЗрдЯрдо рдЧреБрдг рд╕рдВрдкрддреНрддрд┐ 1 рд╣реИ, рдФрд░ рд╕реНрдЯреЛрд░ рдХреЗ рд╕рдВрджрд░реНрдн рд╕реЗ рдЖрдЗрдЯрдо рд╣реИ рдорд╛рд▓ рдХреА рд╕рдВрдкрддреНрддрд┐ рдкреНрд░реЙрдкрд░реНрдЯреА 2 рд╣реИ рддреЛ рдЖрдИрдЯреВрдбреЛ рдХреЗ рдкрд╛рд╕ рдкреНрд░реЙрдкрд░реНрдЯреА 1 рдФрд░ рдкреНрд░реЙрдкрд░реНрдЯреА 2 рджреЛрдиреЛрдВ рд╣реЛрдВрдЧреЗред рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реЛрдЧреА рдЬреЛ рдЖрдЗрдЯрдо рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдЧреА, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╕рдВрджрд░реНрдн рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗред рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдореЗрдВ, рдпрд╣ рдЖрд╕рд╛рди рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрдкрдирд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдЕрдкрдирд╛ рд╕рд╛рд░ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реНрд╡ рд╕реЗрд╡рд╛ рдХреА рдЕрдкрдиреА рдХрдХреНрд╖рд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред рдХреЗрд╡рд▓рдПрдХ рдореЛрдиреЛрд▓рд┐рде рдореЗрдВ, рд╡реЗ рдмрд╕ рдПрдХ-рджреВрд╕рд░реЗ рдореЗрдВ рдореИрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдЖрдЗрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ EF рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреБрдЬрд░рддрд╛ рд╣реИ рдФрд░ рдЬрд┐рд╕рдореЗрдВ рдлрд╝реАрд▓реНрдб рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдпрджрд┐ рдЯреЛрдХрд░реА рдХреЗ рд╕рдВрджрд░реНрдн (рдореЙрдбреНрдпреВрд▓) рд╕реЗ рдЖрдЗрдЯрдо рдореЗрдВ рдЧреБрдг рд╕рдВрдкрддреНрддрд┐ 1 рд╣реИ, рдФрд░ рд╕реНрдЯреЛрд░ рдХреЗ рд╕рдВрджрд░реНрдн рд╕реЗ рдЖрдЗрдЯрдо рд╣реИ рдорд╛рд▓ рдХреА рд╕рдВрдкрддреНрддрд┐ рдкреНрд░реЙрдкрд░реНрдЯреА 2 рд╣реИ рддреЛ рдЖрдИрдЯреВрдбреЛ рдХреЗ рдкрд╛рд╕ рдкреНрд░реЙрдкрд░реНрдЯреА 1 рдФрд░ рдкреНрд░реЙрдкрд░реНрдЯреА 2 рджреЛрдиреЛрдВ рд╣реЛрдВрдЧреЗред рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реЛрдЧреА рдЬреЛ рдЖрдЗрдЯрдо рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдЧреА, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╕рдВрджрд░реНрдн рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗред рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдореЗрдВ, рдпрд╣ рдЖрд╕рд╛рди рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрдкрдирд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдЕрдкрдирд╛ рд╕рд╛рд░ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реНрд╡ рд╕реЗрд╡рд╛ рдХреА рдЕрдкрдиреА рдХрдХреНрд╖рд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред рдХреЗрд╡рд▓рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рднрдВрдбрд╛рд░ рд╣реЛрдЧрд╛ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЙрд╕ рдЖрдЗрдЯрдо рдХреЛ рдЦреАрдВрдЪреЗрдЧрд╛ рдЬреЛ рдЗрд╕ рд╕рдВрджрд░реНрдн рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдореЗрдВ, рдпрд╣ рдЖрд╕рд╛рди рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрдкрдирд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдЕрдкрдирд╛ рд╕рд╛рд░ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реНрд╡ рд╕реЗрд╡рд╛ рдХреА рдЕрдкрдиреА рдХрдХреНрд╖рд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред рдХреЗрд╡рд▓рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реЛрдЧреА рдЬреЛ рдЖрдЗрдЯрдо рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдЧреА, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╕рдВрджрд░реНрдн рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗред рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдореЗрдВ, рдпрд╣ рдЖрд╕рд╛рди рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрдкрдирд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдЕрдкрдирд╛ рд╕рд╛рд░ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реНрд╡ рд╕реЗрд╡рд╛ рдХреА рдЕрдкрдиреА рдХрдХреНрд╖рд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред рдХреЗрд╡рд▓рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрд╛рдЙрдВрдбреЗрдб рдХреЛрдЯреЗрдХреНрд╕реНрдЯ рд╕реЗ рдЖрдЗрдЯрдо рдФрд░ рдЖрдЗрдЯрдо рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдФрд░ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдХреНрд╕рд░, рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рд╢реБрд░реВрдЖрдд рд╕реЗ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрд░реНрдХреНрд╕ рдореЗрдВ рдмрд╛рдЙрдВрдбреЗрдбрдХрдиреЗрдХреНрдЯ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рджрд░реНрдЬрди рд╡рд┐рдзрд┐рдпрд╛рдВ рдпрд╛ рдЧреБрдг рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд░ 1 - 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЙрд╕реА рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдореЗрдВ рд╕рд╛рдЭрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдкрд░рддреЛрдВ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрднрд░рддрд╛




рд╕рд░рд▓ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЬрд┐рд╕рдореЗрдВ рдкрд╛рд░реЗрддреЛ рдХрд╛рдиреВрди 80 рдкреНрд░рддрд┐рд╢рдд рд╣реИ


рдкрд░рдд рдХреЛ рджреВрд░ рдХрд░реЗрдВ рдкреНрд░рд╛рдердорд┐рдХ рдПрдбреЗрдкреНрдЯрд░ рдФрд░ рджреНрд╡рд┐рддреАрдпрдХ рдПрдбреЗрдкреНрдЯрд░ред рдХреЗрд╡рд▓ рддрд░реНрдХ рдкрд░рдд рдЫреЛрдбрд╝ рджреЗрдВред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп ASP.NET рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - PimaryAdater рдирд┐рдпрдВрддреНрд░рдХ рд╣реИ, рдФрд░ рджреНрд╡рд┐рддреАрдпрдХ рдПрдбрд╛рдкреНрдЯрд░ EF рд╕реЗ DbContext рд╣реИред рдпрджрд┐ рдирд┐рдпрдВрддреНрд░рдХ рдЕрдЪрд╛рдирдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдЖрдВрд╢рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдХрд╛рдЯрддреЗ рд╣реИрдВред рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЕрдореВрд░реНрдд рдкреНрд░рдЬрдирди рдФрд░ рдЙрди рдкрд░ рд╕рдордп рдмрд┐рддрд╛рдиреЗ рд╕реЗ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Microsoft рдиреЗ DoM рдХрдВрдЯреЗрдирд░реЛрдВ рдкрд░ рдЕрдкрдиреЗ EShop рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЯреЛрдХрд░реАрдорд╛рдЗрдХреНрд░реЛрдЯреНрд╕ рд╕рд░реНрд╡рд┐рд╕ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд┐рдпрд╛ред рд╣рд╛рдВ, рд╕рд┐рд░реНрдл рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рдХреЛрдб рд▓рд┐рдЦреЗрдВред рдмрд╕ рд╕реНрдкреЗрдЧреЗрдЯреА рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦреЗрдВред рдЬрд░реВрд░реАрдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд▓реЙрдЬрд┐рдХ рдкрд░рдд рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реА рд░рд╣рддреА рд╣реИ рдФрд░ рд╣рдо рдЕрднреА рднреА рдЕрдкрдиреЗ рддрд░реНрдХ рдФрд░ рдбреЛрдореЗрдирд╕рд░реНрд╡рд┐рд╕ рдХреЗ рд╕рд╛рде рдПрдВрдЯрд┐рдЯреАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреА рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рди рдХреЗрд╡рд▓ рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рд╕реНрдкреЗрдЧреЗрдЯреА рдХреЛрдб рдХреА рджреАрд╡рд╛рд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд╣рдо рдмрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ ItemService рдФрд░ ItemRepository рдХреЛ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕ рднрд╛рд╡рдирд╛ рдореЗрдВ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ ItemValidator, ItemMapper, AmountCalculator, рдЖрджрд┐ рдЕрднреА рднреА рд╣рдорд╛рд░реЗ рд╕рд╛рде рдмрдиреЗ рд╣реБрдП рд╣реИрдВред рдЪреВрдБрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХ рд▓реЙрдЬрд┐рдХ рд▓реЗрдпрд░ рд╣реИ, рд╣рдо рдХрд┐рд╕реА рднреА рд╕рдордп рдХрд┐рд╕реА рднреА рд╕рдордп рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг


рдПрдХ рд╕реЗрд╡рд╛ рдЬреЛ рдХрд┐рд╕реА рдЙрддреНрдкрд╛рдж рдХреЗ рдбрд┐рд╕реНрдХрд╛рдЙрдВрдЯ рдкрд░ рдЕрдВрддрд┐рдо рдХреАрдордд рдХреА рдЧрдгрдирд╛ рдХрд░рддреА рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдбреЛрдореЗрди рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдЙрдВрдбреЗрдб рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдЙрддреНрдкрд╛рдж рд╕реВрдЪреА рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕рднреА рд╕рддреНрдпрд╛рдкрди рддрд░реНрдХ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рдЗрд╕реЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ ItemValidator рдФрд░ DiscountValidator рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

1) рд▓реЙрдЬрд┐рдХ рдлреЛрд▓реНрдбрд░:
1.1) рдПрдВрдЯрд┐рдЯреА рдлреЛрд▓реНрдбрд░:

рдбрд┐рд╕реНрдХрд╛рдЙрдВрдЯ:

    public class Discount
    {
        [Key]
        public Guid Id { get; set; }

        public decimal Value { get; set; }
    }

рдкреИрд╕реЗ:

    [Owned]
    public class Money
    {
        public decimal Amount { get; set; }

        public Money Apply(Discount discount)
        {
            var amount = Amount * (1 - discount.Value);
            return new Money()
            {
                Amount = amount
            };
        }
    }

рдЙрддреНрдкрд╛рдж:

    public class Item
    {
        [Key]
        public Guid Id { get; set; }

        public Money Price { get; set; } = new Money();
    }

1.2) DomainServices рдлрд╝реЛрд▓реНрдбрд░ рдЙрддреНрдкрд╛рдж

рдореВрд▓реНрдп рдХреИрд▓рдХреБрд▓реЗрдЯрд░, рдЫреВрдЯ рд╕рд╣рд┐рдд:

    public interface IPriceCalculator
    {
        Money WithDiscounts(Item item, IEnumerable<Discount> discounts);
    }

     public sealed class PriceCalculator:IPriceCalculator
    {
        public Money WithDiscounts(Item item, IEnumerable<Discount> discounts)
        {
            return discounts.Aggregate(item.Price, (m, d) => m.Apply(d));
        }
    }

2) DbContext

    public class ItemsDbContext : DbContext
    {
        public ItemsDbContext(DbContextOptions<ItemsDbContext> options) : base(options)
        {

        }

        public DbSet<Item> Items { get; set; }

        public DbSet<Discount> Discounts { get; set; }
    }

3) рдирд┐рдпрдВрддреНрд░рдХ

    [ApiController]
    [Route("api/v1/items")]
    public class ItemsController : ControllerBase
    {
        private readonly ItemsDbContext _context;
        private readonly IPriceCalculator _priceCalculator;

        public ItemsController(ItemsDbContext context, IPriceCalculator priceCalculator)
        {
            _context = context;
            _priceCalculator = priceCalculator;
        }

        [HttpGet("{id}/price-with-discounts")]
        public async Task<decimal> GetPriceWithDiscount(Guid id)
        {
            var item = await _context.Items.FindAsync(id);
            var discounts = await _context.Discounts.ToListAsync();
            return _priceCalculator.WithDiscounts(item, discounts).Amount;
        }
    }


рдЬрдЯрд┐рд▓ microservices рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рдЬрд┐рд╕рдореЗрдВ рд╕реЗ 20 рдкреНрд░рддрд┐рд╢рдд рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореЛрдиреЛрд▓рд┐рде рдХреЗ рд▓рд┐рдП


рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдкрд░рддреЛрдВ рдХреЗ рдЕрдзрд┐рдХрддрдо рдЕрд▓рдЧрд╛рд╡ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рдирдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред PrimaryAdapter (ItemService) рдФрд░ рд╕реЗрдХреЗрдВрдбрд░реА Adapter (ItemRepository) рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓рд╛рд╕ рдЬреЛрдбрд╝реЗрдВред рддрд░реНрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рд░рд╣рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдкрд╣рд▓реЗ рдерд╛ред

рдЙрджрд╛рд╣рд░рдг


1) рджреНрд╡рд┐рддреАрдпрдХ рдПрдбреЗрдкреНрдЯрд░ рдлрд╝реЛрд▓реНрдбрд░

    public interface IItemsRepository
    {
        Task<Item> Get(Guid id);
    }

    public sealed class ItemsRepository : IItemsRepository
    {
        private readonly ItemsDbContext _context;

        public ItemsRepository(ItemsDbContext context)
        {
            _context = context;
        }

        public async Task<Item> Get(Guid id)
        {
            var item = await _context.Items.FindAsync(id);
            return item;
        }
    }

    public interface IDiscountsRepository
    {
        Task<List<Discount>> Get();
    }

    public sealed class DiscountsRepository : IDiscountsRepository
    {
        private readonly ItemsDbContext _context;

        public DiscountsRepository(ItemsDbContext context)
        {
            _context = context;
        }

        public Task<List<Discount>> Get()
        {
            return _context.Discounts.ToListAsync();
        }
    }


2) рдкреНрд░рд╛рдЗрдорд░реА рдПрдбреЗрдкреНрдЯрд░ рдлрд╝реЛрд▓реНрдбрд░

    public interface IItemService
    {
        Task<decimal> GetPriceWithDiscount(Guid id);
    }

    public class ItemService : IItemService
    {
        private readonly IItemsRepository _items;
        private readonly IDiscountsRepository _discounts;
        private readonly IPriceCalculator _priceCalculator;

        public ItemService(IItemsRepository items, IDiscountsRepository discounts, IPriceCalculator priceCalculator)
        {
            _items = items;
            _discounts = discounts;
            _priceCalculator = priceCalculator;
        }

        public async Task<decimal> GetPriceWithDiscount(Guid id)
        {
            var item = await _items.Get(id);
            var discounts = await _discounts.Get();
            return _priceCalculator.WithDiscounts(item, discounts).Amount;
        }
    }

рд╣рдорд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рдХ рдЕрдм рд╣рдорд╛рд░реЗ IItemService рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ

    [ApiController]
    [Route("api/v1/items")]
    public class ItemsController : ControllerBase
    {
        private readonly IItemService _service;

        public ItemsController(IItemService service)
        {
            _service = service;
        }

        [HttpGet("{id}/price-with-discounts")]
        public async Task<decimal> GetPriceWithDiscount(Guid id)
        {
            var result = await _service.GetPriceWithDiscount(id);
            return result;
        }
    }

рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╕рд┐рд╕реНрдЯрдо рд▓рдЪреАрд▓рд╛рдкрди рдмрдврд╝рд╛ред рдЕрдм рдХрдВрдЯреЛрд▓рд░ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ ASP.NET Core рдХреЛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдореЗрдВ рдмрджрд▓рдирд╛ рдпрд╛ DbContext рдФрд░ EntityFramework Core рдХреЛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдореЗрдВ рдмрджрд▓рдирд╛ рдпрд╛ Redis рдореЗрдВ рдХреИрд╢рд┐рдВрдЧ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдкрд╣рд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рд░рд▓ рдорд╛рдЗрдХреНрд░реЛрд╕рд┐рд╕реНрдЯрд░реНрд╕ рдФрд░ рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рдЫреЛрдЯреЗ рдореЛрдиреЛрд▓рд┐рде рдореЗрдВ рдЬреАрддрддрд╛ рд╣реИред рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рджреВрд╕рд░рд╛, рдЬрдм рдЖрдкрдХреЛ рдПрдХ рд╡рд░реНрд╖ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдЗрд╕ рдХреЛрдб рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЦреИрд░, рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, рдПрдВрдЯрд┐рдЯреА рдЖрдЗрдЯрдо рдФрд░ рдбрд┐рд╕реНрдХрд╛рдЙрдВрдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреАрдЯреАрдУ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬреЛ DbContex EF рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреАрдЯреАрдУ (рдореЙрдбрд▓) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдЬреЛ ASP.NET рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдЕрд░реНрдерд╛рддреНред рдЖрдЗрдЯрдордбреЙрдЯ рдФрд░ рдЖрдЗрдЯрдордореЙрдбрд▓ред рдпрд╣ рдбреЛрдореЗрди рдореЙрдбрд▓ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрд╡рддрдВрддреНрд░ рдмрдирд╛ рджреЗрдЧрд╛ред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдПрдХ рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдореИрдВрдиреЗ 2nd TestRuvds рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрд╛ рдерд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╣ рдпрд╣рд╛рдБ рдмреЗрдорд╛рдиреА рд╣реИ, рдФрд░ рдпреЗ рд╕рднреА рд╕рд╛рд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдБ рд╣реИрдВред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрджрд╛рд╣рд░рдг


VirtualServersModule

рд╕реНрд╡реАрдХреГрддрд┐рдпрд╛рдБ


рдзрдиреНрдпрд╡рд╛рдж canxes рддрдерд╛ AndrewDemb рд╡реНрдпрд╛рдХрд░рдг рд╕рдВрдмрдВрдзреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдПред

All Articles