
рдкреВрд░реНрд╡ рдХрд╣рд╛рдиреА
рдореЗрд░рд╛ рдкрд┐рдЫрд▓рд╛
рд▓реЗрдЦ рдЗрдВрдХреЛрдбрд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдПрдХ рдкрд░рд┐рдЪрдп рдерд╛, рдЬреЛ IML (рд╣рдорд╛рд░реА рдкреНрд░рдореБрдЦ рд╡рд┐рд╢реЗрд╖рддрд╛) рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ рдерд╛ред рдХрдВрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ (рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╕рд╛рдорд╛рди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдХрд┐рд╕реА рднреА рдЯреАрдо рдореЗрдВ) рд╕реЗ рдЕрдзрд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IML рдиреЗ рд╣рдореЗрдВ рдзрдХреНрдХрд╛ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрдо рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ "рдкреЙрд▓рд┐рд╢" рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред ред
рдЪрд╛рдВрджреА рдХреА рдЧреЛрд▓реА?
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рд╣рдореЗрд╢рд╛ рдПрдХ рд╕рдорд░реНрдердХ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдЗрд╕рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рд╣реИрдВ, рд▓реЗрдХрд┐рди CQRS, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрди-рд▓реЗрдпрд░ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ "рдорддрднреЗрдж" рдпрд╛ "рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ" рднреА рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдХреНрд▓рд┐рдк рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдХрд╛рд░рддреВрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдореНрдореАрджрд╡рд╛рд░ рдмрдирд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЪреАрдЬреЗрдВ рдкрд╣рд▓реЗред
рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ CQRS рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ?
рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА CQRS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдкрд╣рд▓рд╛ рдЦрдВрдб рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк "рдмрд╛рдЗрдХ" рд▓реЗрдмрд▓ рдбрд╛рд▓реЗрдВ, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╣рддреНрдпрд╛ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрднрд╛рдЧ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдПрдВ, рдЬреЛ рдЖрдкрдХреЛ рдЕрдиреНрдпрдерд╛ рдордирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЬреЛ рд▓реЛрдЧ рдПрди-рд▓реЗрдпрд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ CQRS рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ CQRS рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рдмрддрд╛рдКрдВрдЧрд╛
рдУрд╣, рдХрд┐рддрдиреЗ рд╕рд╛рд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВ (рдЕрддреАрдд рд╕реЗ рд░рд╛рдп)
рдЬрдм рд╣рдордиреЗ рдХреЗрд╡рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рд╣рдордиреЗ рдПрди-рд▓реЗрдпрд░ рдХреЛ рд╕рд░реНрд╡рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛, рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрдИ рдкрд░рддреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╣рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ рдорд┐рд▓реАрдВ:
- рд╕реНрд░реЛрдд рдХреЛрдб рдХреА "рд╕реВрдЬрди", рд╕рдорд╕реНрдпрд╛ рдЬреНрдпрд╛рджрд╛рддрд░ рдЯрд╛рдИ рдкрд░рддреЛрдВ рдЬреИрд╕реЗ рдХрд┐ рдореБрдЦреМрдЯрд╛ рдкрд░рдд, рд╕рдВрдЪрд╛рд░ рдкрд░рдд, рдЖрджрд┐ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддреА рд╣реИред
- рдХрдИ рдкрд░рдд рд╕реНрддрд░реЛрдВ рдХреЗ рдкреАрдЫреЗ рд╡рд┐рд╡рд░рдг рдЫрд┐рдкрд╛рддреЗ рд╣реБрдПред
рдиреЛрдЯ: N-Layer рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкрд░рдд рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди dll рдХреЗ рд╕рд╛рде рднреА рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмреЗрд╣рдж рдХрдо рдорд╛рдВрдЧ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдп IoC рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИредрдПрди-рд▓реЗрдпрд░ рдореЗрдВ "рдмреБрд░рд╛рдИ" рдХрд╛ рдореБрдЦреНрдп рд╕реНрд░реЛрдд рдЕрдХреНрд╕рд░ рд╕реЗрд╡рд╛ рдХреА рдкрд░рдд рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рд╣реА рд╡рд░реНрдЧ рдореЗрдВ рд╕рдорд╛рди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХрддреНрд░рд┐рдд рдХрд░рдХреЗ, рд╡реНрдпрд╛рдкрд╛рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдЬрд┐рдХ рдХреЗ рдХрд╛рдо рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЕрдВрддрддрдГ рдЗрд╕реЗ GOD рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ:
- рдирд┐рдХрдЯ рд╕рдВрдмрдВрдзреА рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛
- рдПрдХ рдмрдбрд╝реА рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ
рдпрджрд┐ рдЖрдк рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдХреЛ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рддреЛ CQRS рдореЗрдВ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рдмрдбрд╝реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЫреЛрдЯреЗ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛
public interface IUserService { void Add(string name); void Delete(string id); List<User> Fetch(Criteries criteries); }
рдЕрдкрдШрдЯрди рдХреЗ рдмрд╛рдж, рд╣рдо рджреЛ рдХрдорд╛рдВрдб (AddUser, DeleteUser) рдФрд░ рдХреНрд╡реЗрд░реА (FetchUser) рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдЫ рддрд░реАрдХреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
"рдЕрдм рд╣рдореЗрдВ рдФрд░ рднреА рдЕрдзрд┐рдХ рдХрдХреНрд╖рд╛рдПрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ!" - рдпрд╣ рдПрди-рд▓реЗрдпрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдкреВрдЫрд╛ рдЧрдпрд╛ рдкрд╣рд▓рд╛ рд╕рд╡рд╛рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкреНрд░рддрд┐рд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рдпрд╣ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдЯрдореЙрд╕рд┐рдЯреА (рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ) рдорд┐рд▓рддреА рд╣реИ, рдФрд░ рдпрд╣ рдмрд╣реБрдд рд▓рд╛рдпрдХ рд╣реИ:
- VCS рдореЗрдВ рдХрдо рд╕рдВрдШрд░реНрд╖ (рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА)
- рдХрдХреНрд╖рд╛ рдХреА рдЦреЛрдЬ рд╡рд┐рдзрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ
- рдЕрдм рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗрд╡рд╛ рдХреЛ рдЖрдВрд╢рд┐рдХ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдХреЛ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ))
- рдХрдорд╛рдВрдб рдФрд░ рдХреНрд╡реЗрд░реА рд╕реЗ рдЧрдард┐рдд рдмрдЧрдЯреНрд░реИрдХрд░ рдкрд░ рдореБрджреНрджрд╛
- рдлреБрд░реНрддреАрд▓реА рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЯ рдХрдорд╛рдВрдб рдФрд░ рдХреНрд╡реЗрд░реА рд╕реЗ рдмрдирддрд╛ рд╣реИ
- рдЫреЛрдЯреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг
рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЙрди рдЕрдзреАрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреЛрдб рдХреЛ рддреБрд░рдВрдд "рдорд╣рд╕реВрд╕" рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЖрдк рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЧреАрдерд╣рдм рд╕реЗ рдЗрдВрдХреЛрдбрд┐рдВрдЧ рд╕реАрдХреНрдпреВрдЖрд░рдПрд╕ + рдПрдорд╡реАрдбреА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рднреА рд╣реИ), рд╣рдо рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреЗрдВрдЧреЗред
рдзреНрдпрд╛рди рджреЗрдВ: рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЦрд╛рд▓реА рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдиреЗ рдФрд░ web.config (рдореБрдЦреНрдп рдореБрдЦреНрдп) рдореЗрдВ рдЗрд╕рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИрдбрд┐рд╕реНрдкреИрдЪрд░
рдореБрдЦреНрдп рддрддреНрд╡ рдЬреЛ рдПрдХрд▓ рд▓реЗрдирджреЗрди (рдХрд╛рд░реНрдп рдХреА рдЗрдХрд╛рдИ) рдореЗрдВ
рд╕рдВрджреЗрд╢ (
рдХрдорд╛рдВрдб рдпрд╛
рдХреНрд╡реЗрд░реА ) рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдирд┐рдпрдВрддреНрд░рдХ - asp.net mvc (рдХрдВрд╕реЛрд▓, wpf, рдУрд╡рд┐рди рдФрд░ рдЖрджрд┐) рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдбрд┐рд╕реНрдкреИрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрдИрдУрд╕реА рд╕реЗ рдЗрд╕рдХреА рдЖрд╡реГрддреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рджреЛ рддрд░реАрдХреЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:
- рдкреБрд╢ - рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ
- рдХреНрд╡реЗрд░реА - рдПрдХ рдХреНрд╡реЗрд░реА рдХрд░рддрд╛ рд╣реИ
public ActionResult Test() { var dispatcher = IoCFactory.Instance.TryResolve<IDispatcher>(); var id = dispatcher.Query(new GetIdQuery()); dispatcher.Push(new DeleteEntityByIdCommand(id)); return something ActionResult; }
рдХрд╛рд░реНрдп рдХреА рдЗрдХрд╛рдИ - рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА
рдХрдорд╛рдВрдб рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореБрдЦреНрдп рдХреЛрдб рдЕрддрд┐рднрд╛рд░рд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рд╡рд┐рдзрд┐ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ, рдЬрд┐рд╕реЗ рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рдмрд┐рдирд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрдм рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рд▓реЗрдирджреЗрди рдХрд╛ рдХрдиреЗрдХреНрд╢рди рдЦреБрд▓рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
new DeactivateEntityCommand().Execute();
рд╕рдВрджреЗрд╢
CommandBase рдФрд░ QueryBase рд╕рдВрджреЗрд╢ рдХреЗ рдмрдЪреНрдЪреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЙрд╕ рдЕрд▓рдЧрд╛рд╡ рд╕реНрддрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХреА рдЗрдХрд╛рдИ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ
- рдХрдорд╛рди - ReadCommitted
- рдкреНрд░рд╢реНрди - ReadUncommitted (рдХреЗрд╡рд▓ рдкрдврд╝реЗрдВ)
рдиреЛрдЯ: рдкреНрд░рддрд┐рдмрдВрдз рдЧрдВрднреАрд░ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдкрдХреЛ рдХреНрд╡реЗрд░реА рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╣рдЯрд╛рдиреЗ (рд╣рдЯрд╛рдиреЗ, рдбрд╛рд▓рдиреЗ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЕрдкрдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЫреЛрдЯреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдХреЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПредрд╕рдВрджреЗрд╢ рдХреЗ рджреЛ рдореБрдЦреНрдп рдЙрдкрдХрд░рдг рд╣реИрдВ:
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА - рдбреЗрдЯрд╛рдмреЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рд╕рднреА CRUD рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ
рдЙрджрд╛рд╣рд░рдгрдмрдирд╛рдПрдВ
Repository.Save(new entity())
рдкрдврд╝реЗрдВ
Repository.GetById<TEntity>(id); Repository.Query(whereSpecification: spec, orderSpecification:spec, paginatedSpecification:spec)
рдиреЛрдЯ: рдХреНрд╡реЗрд░реА (рдкреГрд╖реНрдардмрджреНрдз) рд╕рдмрд╕реЗ рд╡реНрдпрд╛рдкрдХ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рдХреНрд╡реЗрд░реА рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИредрдЕрджреНрдпрддрди
var entityFromDb = Repository.GetById<TEntity>(id); entityFromDb.Title = "New title";
рдзреНрдпрд╛рди рджреЗрдВ: рдпрджрд┐ рдкреНрд░рджрд╛рддрд╛ ORM рдЯреНрд░реИрдХрд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ Repository.SaveOrUpdate (рдПрдВрдЯрд┐рдЯреА) рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИрд╣рдЯрд╛рдПрдВ
Repository.Delete<TEntity>(id);
рдЗрд╡реЗрдВрдЯ рдмреНрд░реЛрдХрд░ - рдХрдорд╛рдВрдб рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░, рдЬреЛ рдЖрдкрдХреЛ рдХреЛрдб рдХреЗ рдлрд┐рд░ рд╕реЗ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ "рдЯреБрдХрдбрд╝реЛрдВ" рдХреЛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдФрд░ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рддрд╛ рд╣реИред
рдХрд╛рд░реНрдп: рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд▓реЗрдЦрд╛-рдЬреЛрдЦрд╛
рд╕рдорд╕реНрдпрд╛: рдСрдбрд┐рдЯ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╕рдорд╛рди рд╣реЛрдЧрд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рдореЗрдВ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛
рд╕рд░реНрд╡рд┐рд╕ рд▓реЗрдпрд░ рдореЗрдВ рд╕рдорд╛рдзрд╛рди: рдЖрдк рдмреЗрд╕ рдХреНрд▓рд╛рд╕ ServiceWithAuditBase рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдСрдбрд┐рдЯ рдХреА рдмрдврд╝рддреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛, рдФрд░ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рд╣рдореЗрд╢рд╛ рдЬрдЯрд┐рд▓рддрд╛ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред
рд╕рджрд╕реНрдп рд╕рдорд╛рдзрд╛рдирдШрдЯрдирд╛ рдХреЛрдб
public class OnAuditEvent : IEvent { public string Message { get; set; } }
рдиреЛрдЯ: рдИрд╡реЗрдВрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕реНрдерд┐рддрд┐рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдХреЛрдб
public class AuditSubscriber : IEventSubscriber<OnAuditEvent> { readonly IRepository repository; public AuditSubscriber(IRepository repository) { this.repository = repository; } public void Subscribe(OnAuditEvent @event) { this.repository.Save(new Audit { Message = @event.Message }); } public void Dispose() { } }
рдиреЛрдЯ: рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ IoCFactory рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЖрдк ctor (рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░) рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ IoCFactory.Instance.TryResolve () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдХрдорд╛рдВрдб рдХреЛрдб
EventBroker.Publish(new OnAuditEvent { Message = "New product {0} by {1}".F(Title, Price) });
рд╕рд╡рд╛рд▓
рдПрдХ рдХрд╕реНрдЯрдо рдХреНрд╡реЗрд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ QueryBase рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд╣рд╛рдБ рдЖрдк рдЕрдкреЗрдХреНрд╖рд┐рдд рдбреЗрдЯрд╛ рд░рд┐рдЯрд░реНрди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ ExecuteResult рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ
public class GetProductsQuery : QueryBase<List<GetProductsQuery.Response>> { public class Response { public string Title { get; set; } public string Price { get; set; } } public string Title { get; set; } public decimal? From { get; set; } public decimal? To { get; set; } protected override List<Response> ExecuteResult() { return Repository.Query(whereSpecification: new ProductByTitleWhere(this.Title) .And(new ProductBetweenPriceWhere(this.From, this.To))) .Select(product => new Response { Title = product.Title, Price = product.Price.ToString("C") }) .ToList(); } }
рд╣рдо рднреЗрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рдХреНрд▓рд╛рд╕ рдХреЛ рд░рд┐рдЬрд▓реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВ рдирд╣реАрдВ ...
рдбреЗрдЯрд╛рдмреЗрд╕ (рдЗрдХрд╛рдИ) рд╕реЗ рддреБрд░рдВрдд рдПрдХ рд╡рд╕реНрддреБ рд▓реМрдЯреЗрдВ - рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреЗ рд╕рддреНрд░ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдЙрджрд╛рд╣рд░рдгрдХреНрд╡реЗрд░реА рдХреЛрдб
return Repository.Query<Product>();
рдирд┐рдпрдВрддреНрд░рдХ рдХреЛрдб
dispatcher.Query(new GetProductsQuery()) .Select(r=> new { Amount = r.Orders.Sum(r=>r.Price))
ORM рдореИрдкрд┐рдВрдЧ рд╕реНрддрд░ рдкрд░ рдЖрд▓рд╕реА рд▓реЛрдб (рдХреЗрд╡рд▓ OLAP рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ) рдХреЛ рдмрдВрдж рдирд╣реАрдВ рдХрд░рдиреЗ рдкрд░ рддреНрд░реБрдЯрд┐ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдХреНрд╡реЗрд░реА рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╕рддреНрд░ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдСрд░реНрдбрд░ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡реНрдпреВрдореЙрдбрд▓ рдиреЗрд╕реНрдЯреЗрдб рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдХреНрд╡реЗрд░реА рдореЗрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде, рдЬреЛ рдПрдХ рдЕрддреНрдпрдВрдд рджреБрд░реНрд▓рдн рдкрд░рд┐рджреГрд╢реНрдп рд╣реИред
рдЖрджреЗрд╢
CQRS рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХрд╛ рд╣рдорд╛рд░рд╛ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рд╖реНрдкрд╛рджрдХ (UserCommandHandler) рд╕реЗ рд╡рд┐рд╡рд░рдг (AddUserCommand) рдХреЗ рдкреГрдердХреНрдХрд░рдг рдХреЗ рд╕рд╛рде рдерд╛, рдЬреЛ рд╡рд┐рдХрд╛рд╕ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрди рднрд╛рдЧреЛрдВ рдХреЛ рдФрд░ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ред
рдиреЛрдЯ: рдЕрд▓рдЧ рд╣реЛрдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг SOAP рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП DTO (рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдСрдмреНрдЬреЗрдХреНрдЯ) рдореЙрдбрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдерд╛, рд▓реЗрдХрд┐рди asp.net mvc рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рдпрд╣ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рдмрди рдЧрдпрд╛
рдПрдХ рдХрд╕реНрдЯрдо рдХрдорд╛рдВрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдорд╛рдВрдбрдмреЗрд╕ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдПрдХреНрд╕рдХреНрдпреВрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛
public class AddProductCommand : CommandBase { public string Title { get; set; } public decimal Price { get; set; } public override void Execute() { var product = new Product { Title = Title, Price = Price } Repository.Save(product); Result = product.Id; } }
рдиреЛрдЯ: рдРрд╕реЗ рдкрд░рд┐рджреГрд╢реНрдп рд╣реИрдВ рдЬрд╣рд╛рдВ рдХрдорд╛рдВрдб рдХреЛ рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЖрдк рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХрдорд╛рдВрдб рд╡рд┐рдзрд┐ рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ
рд╣рддреНрдпрд╛ рдХреА рд╕реБрд╡рд┐рдзрд╛
рдХрдореНрдкреЛрдЬрд┐рдЯ
CQRS рдЫреЛрдЯреЗ рд▓реЛрдЧреЛрдВ рдореЗрдВ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ "рд╡рд┐рднрд╛рдЬрд┐рдд" рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдордЧреНрд░ рдирд┐рд╖реНрдкрд╛рджрди рд▓реЗрдирджреЗрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред
рдХрд╛рд░реНрдп : рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ 3 рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕рд╣реЗрдЬрдирд╛
рд╕рдорд╛рдзрд╛рди : рддреАрди рдЖрджреЗрд╢реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд (Step1Command, Step2Command, Step3Command)
рд╢рд░реНрдд : рд▓реЗрди-рджреЗрди
public ActionResult Save(Step1Command step1,Step2Command step2,Step3Command step3) { dispatcher.Push(composite => { composite.Quote(step1); composite.Quote(step2); composite.Quote(step3); }); return IncodingResult.Success(); }
рдХрдорд╛рдВрдб рдХреЛ рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рд╕рдореВрд╣реАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдореНрдкреЛрдЬрд┐рдЯ рдЖрдкрдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдХрд╛рд░реНрдп рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╢рд░реНрдд рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж Step1 рдирдП рддрддреНрд╡ рдХреА Id рдХреЛ рдЪрд░рдг 2 рдФрд░ 3 рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░ рджреЗред
public ActionResult Save(Step1Command step1,Step2Command step2,Step3Command step3) { dispatcher.Push(composite => { composite.Quote(step1,new MessageExecuteSetting { OnAfter = () => { step2.Id = step1.Result; step3.Id = step1.Result; } }); composite.Quote(step2); composite.Quote(step3);}); }
рд╣реЙрдЯ рд╕реНрд╡реИрдк рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ
рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рдо рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рддреГрддреАрдп-рдкрдХреНрд╖ рд╕реЗрд╡рд╛ рд╡рд░реНрддрдорд╛рди рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрддрд╛ рдЬрд╛рд░реА рдХрд░рддреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрде рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
dispatcher.Query(query, new MessageExecuteSetting { Connection = new SqlConnection(currentConnectionString) });
рд╡рд┐рд░рд╛рд╕рдд рдкреНрд░рдгрд╛рд▓реА
"рдкреБрд░рд╛рдиреЗ is рдЖрдзрд╛рд░ рдкрд░ рд▓рдкреЗрдЯрдирд╛ рдЗрдВрдХреЛрдбрд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдРрд╕реЗ рдЙрдкрдХрд░рдг рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪрд╛ рдмрдирд╛рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдФрд░ рдЗрд╕ рд╡рд┐рд╡рд░рдг рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХрдорд╛рдВрдб рдФрд░ рдХреНрд╡реЗрд░реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
dispatcher.Query(query, new MessageExecuteSetting { DataBaseInstance = "Instance 2" });
рдиреЛрдЯ: рдкреНрд░рддреНрдпреЗрдХ рдХреБрдВрдЬреА рдХрд╛ рдЕрдкрдирд╛ ORM рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ
рдирд┐рд╖реНрдХрд░реНрд╖
рд▓реЗрдЦ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрдирдХреЛрдбрд┐рдВрдЧ CQRS рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕рдореАрдХреНрд╖рд╛ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП CQRS рдХрд╛рд░реНрдпрдкреНрд░рдгрд╛рд▓реА рдХреА рд╕рдореАрдХреНрд╖рд╛ рд╕реНрд╡рдпрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ, рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИред рдЗрдВрдХреЛрдбрд┐рдВрдЧ CQRS рд╣рдорд╛рд░реЗ рдврд╛рдВрдЪреЗ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрддреНрдордирд┐рд░реНрднрд░ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдиреНрдп рдШрдЯрдХреЛрдВ (IML, MVD, Unit Test) рдХреЗ рдмрд┐рдирд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
IML рдХреЗ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рд╡реИрдХрд▓реНрдкрд┐рдХ (OWIN) рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ asp.net mvc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╡рд╛рд▓ рдереЗ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рддреБрд░рдВрдд рдзреНрдпрд╛рди рджреВрдВрдЧрд╛ рдХрд┐ Incoding CQRS рдХрд╛ рдЙрдкрдпреЛрдЧ WPF рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ MML рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕ рдорд╣реАрдиреЗ рдПрдХреАрдХрд░рдг рдкрд░ рдПрдХ рд▓реЗрдЦ рд╣реЛрдЧрд╛ ред
рдкреБрдирд╢реНрдЪ рдореИрдВ рд╕рдореАрдХреНрд╖рд╛ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд╢ рд╣реВрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдХрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕рд╡рд╛рд▓ рдХрд░рддрд╛ рд╣реВрдВред рдЕрдЧрд▓реЗ рд╣рд░рд┐рдд рдирд╛рдпрдХ рдЗрдирдХреЛрдбрд┐рдВрдЧ рдПрдорд╡реАрдбреА рдЬреЛ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХреЗ рдЦрд┐рд▓рд╛рдл рд▓рдбрд╝рддрд╛ рд╣реИ, рд╡рд╣ рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдореЗрдВ рд╣реЛрдЧрд╛)))