рд╕реНрдЯреЗрд░реЙрдпрдб рдкрд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ

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

рдпрджрд┐ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрдЯ "рд▓реАрдХ" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рднрд╛рд╖рд╛ рдХреЗ рдЪрд┐рдкреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рдХреНрдпрд╛ рдЖрдк "рд╡рд┐рдирд┐рд░реНрджреЗрд╢" рдкреИрдЯрд░реНрди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдЪреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ - рдХрдЯ рдХреЗ рдиреАрдЪреЗ рджреЗрдЦреЗрдВред

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

рдЕрдЧрд▓рд╛, рд╣рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреЗрдбрд╝ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИрдВ, рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╡реЗ рд╣рдорд╛рд░реА рдорджрдж рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдВрдд рдореЗрдВ, рдореИрдВ рд╕реНрдЯреЗрд░реЙрдпрдб рдкрд░ "рд╡рд┐рдирд┐рд░реНрджреЗрд╢" рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реВрдВрдЧрд╛ред

рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ рд╣реИрдВ рдореВрд▓ рдмрд╛рддреЛрдВ рд╕реЗред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдиреЗ "рд╡рд┐рдирд┐рд░реНрджреЗрд╢" рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдиреЗ рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реИ, рдЙрдирдХреА рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ:

рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдПрдХ "рд╡рд┐рдирд┐рд░реНрджреЗрд╢" рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдирд┐рдпрдореЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдмреБрд▓рд┐рдпрди рддрд░реНрдХ рд╕рдВрдЪрд╛рд▓рди рджреНрд╡рд╛рд░рд╛ рдЬреБрдбрд╝реА рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдореЗрдВ рдРрд╕реЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ (рдирд┐рдпрдореЛрдВ) рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рд╛рде "рдпреБрдЧреНрдорди" рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред рдПрдХ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд▓реЙрдЬрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд╛рд░ рдПрдЧреНрд░реАрдЧреЗрдЯ рдХреНрд▓рд╛рд╕ рдХрдВрдкреЛрдЬрд╝реАрд╕реЗрдлрд┐рдХреЗрд╢рди рд╕реЗ рдЕрдкрдиреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ IsSatisfiedBy рд╡рд┐рдзрд┐ рд╣реЛрддреА рд╣реИ рдЬреЛ рдмреВрд▓рд┐рдпрди рдорд╛рди рд▓реМрдЯрд╛рддреА рд╣реИред рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреЗ рдмрд╛рдж, рд╡рд╕реНрддреБ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдЬрдВрдЬреАрд░ рд╣реЛрддреА рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд▓рдЪреАрд▓рд╛рдкрди рдЦреЛрдП рдмрд┐рдирд╛, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдирдП рдирд┐рдпрдо рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдПрдХ рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ (рдЬрдВрдЬреАрд░реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдирд╛)

public interface ISpecification { bool IsSatisfiedBy(object candidate); } 

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

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

рдЫрд╡рд┐

рдпрд╣ рдореЙрдбрд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╢рд┐рдерд┐рд▓ рд░реВрдк рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдРрд╕реЗ рдлрд╝реАрд▓реНрдб рднреА рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП ORM рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрдиреЗрдХреНрд╢рди рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рддрд┐рдерд┐ рдХреЗ рдмрд╛рдж рдмрдирд╛рдП рдЧрдП рд╕рднреА рд╡рд░реНрдгреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝реЙрд░реНрдо рдХрд╛ рд╡рд┐рд╡рд░рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 public class CreatedAfter: ISpecification { private readonly DateTime _target; public CreatedAfter(DateTime target) { _target = target; } bool IsSatisfiedBy(object candidate) { var character = candidate as Character; if(character == null) return false; return character.CreatedAt > target; } } 

рдлрд┐рд░, рдЗрд╕ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдЗрд╕рдХреЗ рдмрд╛рдж рдореИрдВ NHibernate рдЖрдзрд╛рд░рд┐рдд рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛):

 var characters = await session.Query<Character>().ToListAsync(); var filter = new CreatedAfter(new DateTime(2020, 1, 1)); var newCharacters = characters.Where(x => filter.IsSatisfiedBy(x)).ToArray(); 

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

рдПрдХ рдмрд╛рд░, рдПрдХ рдмрд╣реБрдд, рдмрд╣реБрдд рджреВрд░ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рдереАрдВ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдереЗред рд╡реЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗ:

 public class ICharacterDal { IEnumerable<Character> GetCharactersCreatedAfter(DateTime date); IEnumerable<Character> GetCharactersCreatedBefore(DateTime date); IEnumerable<Character> GetCharactersCreatedBetween(DateTime from, DateTime to); ... } 

рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ:

 var dal = new CharacterDal(); var createdCharacters = dal.GetCharactersCreatedAfter(new DateTime(2020, 1, 1)); 

рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЕрдВрджрд░ DBMS рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рдерд╛ (рдЙрд╕ рд╕рдордп рдпрд╣ ADO.NET рдерд╛)ред

рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рде, рдпреЗ рд╡рд░реНрдЧ рднреА рдмрдврд╝рддреЗ рдЧрдП, рдХрдареЛрд░-рд╕реЗ-рдмрдирд╛рдП рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдмрджрд▓ рдЧрдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдЕрдкреНрд░рд┐рдп aftertaste рдерд╛ - рдпрд╣ рдПрдХ рд╡реНрдпрд╛рдкрд╛рд░ рдирд┐рдпрдо рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдмрдВрдзреЗ рдереЗред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ IQueryable <T> рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдиреЗ рд╕рднреА рдирд┐рдпрдореЛрдВ рдХреЛ рд╕реАрдзреЗ рдбреЛрдореЗрди рдкрд░рдд рдкрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдереАред

 public interface IRepository<T> { T Get(object id); IQueryable<T> List(); void Delete(T obj); void Save(T obj); } 

рдЬреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

 var repository = new Repository(); var targetDate = new DateTime(2020, 1, 1); var createdUsers = await repository.List().Where(x => x.CreatedAd > targetDate).ToListAsync(); 

рдереЛрдбрд╝рд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдирд┐рдпрдо рдХреЛрдб рдХреЗ рд╕рд╛рде рд░реЗрдВрдЧрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рд╣реА рдЪреЗрдХ рд╕реИрдХрдбрд╝реЛрдВ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдпрд╣ рдмрджрд▓рддреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЫрд┐рдкрд╛рддрд╛ рд╣реИ - рдпрджрд┐ рдЖрдк рдХреНрд╡реЗрд░реА рдХреЛ рднреМрддрд┐рдХ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рд╣реИ, рдПрдХ рдХреЗ рдмрдЬрд╛рдп, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдкреНрд░рддрд┐рдХреВрд▓ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓рддрд╛ рд╣реИред

рдФрд░ рдпрд╣рд╛рдБ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░, рдПрдХ рд╕рд╣рдХрд░реНрдореА рдиреЗ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛, рдЬрд┐рд╕рдиреЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреЗрдбрд╝реЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд "рд╡рд┐рдирд┐рд░реНрджреЗрд╢" рдкреИрдЯрд░реНрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдордиреЗ рдЙрди рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдУрдВ рдХреЛ рдлрд┐рд▓реНрдорд╛рдпрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдирд╛рдиреЗ рдФрд░ рд╕рд░рд▓ рдирд┐рдпрдореЛрдВ рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдлрд┐рд▓реНрдЯрд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирдП рд╕рд╛рд▓ рдХреЗ рдмрд╛рдж рдмрдирд╛рдП рдЧрдП рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╣реИ рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдЗрдЯрдо рдХреЗ рд╕рд╛рде рд╡рд░реНрдгреЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╣реИ - рдлрд┐рд░ рдЗрди рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рд╕реЗ рд╣рдо рдирдП рд╕рд╛рд▓ рдХреЗ рдмрд╛рдж рдмрдирд╛рдП рдЧрдП рдкрд╛рддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрдЗрдЯрдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЕрдЧрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдо рдирдП рд╡рд░реНрдгреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЪреАрдиреА рдирдП рд╕рд╛рд▓ рдХреА рддрд╛рд░реАрдЦ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ), рддреЛ рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╣реА рд╕рд╣реА рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ!

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

  • gluing рдСрдкрд░реЗрдЯрд░ рдпрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛;
  • рд╕рдВрдШ рдХреЗрд╡рд▓ рдЙрди рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд┐рд▓реНрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдореГрджреНрдз рдирд┐рдпрдо (рдиреЗрд╕реНрдЯреЗрдб рдХреНрд╡реЗрд░реАрдЬрд╝, рд╕реНрдХрд┐рдк / рдЯреЗрдХ, рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛) рдЪрд╛рд╣рд┐рдП рдереЗ;
  • рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреЛрдб рдЪрдпрдирд┐рдд ORM рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ;
  • ORM рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕рдХреЗ рдХрд╛рд░рдг рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдкрд░рдд рдореЗрдВ рдЙрд╕ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рд╕рдорд╛рд╡реЗрд╢ рд╣реЛ рдЧрдпрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдерд╛)ред

рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо Singularis.Secification рдорд┐рдиреА-рдлреНрд░реЗрдорд╡рд░реНрдХ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рд╡рд┐рдзрд╛рдирд╕рднрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • Singularis.Specification.Definition - рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ IQuery рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рднреА рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдирд┐рдпрдо рдмрдирддрд╛ рд╣реИред
  • Singularis.Specification.Executorред * - рд╡рд┐рд╢рд┐рд╖реНрдЯ ORM рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдУрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдФрд░ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ (рд╡рд░реНрддрдорд╛рди рдореЗрдВ ef.core рдФрд░ NHibernate рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВрдиреЗ рднреА рдореЛрдВрдЧреЛрдбрдм рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдб рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдирд╣реАрдВ рдЧрдпрд╛ рдерд╛)ред

рдЖрдЗрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред

рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдирд┐рдпрдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

 public interface ISpecification { IQuery Query { get; } Type ResultType { get; } } public interface ISpefication<T>: ISpecification { } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ ResultType рд╕рдВрдкрддреНрддрд┐ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХреНрд╡реЗрд░реА рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреНрд░рд╛рдкреНрдд рдХреА рдЧрдИ рдЗрдХрд╛рдИ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреА рд╣реИред

рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ <T> рд╡рд░реНрдЧ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ, рдЬреЛ рдкрд░рд┐рдгрд╛рдо рд╕реНрд╡рд░реВрдк рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдХреНрд╡реЗрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд┐рдпрдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рджреЛ рддрд░реАрдХреЗ: рд╕реНрд░реЛрдд () рдФрд░ рд╕реНрд░реЛрдд <TSource> () ред рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд┐рдпрдо рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИрдВред рд╕реНрд░реЛрдд () рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рдпрдо рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╡рд░реНрдЧ рдХреЗ рддрд░реНрдХ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реНрд░реЛрдд <TSource> () рдЖрдкрдХреЛ рдПрдХ рдордирдорд╛рдирд╛ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдо рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреЗрд╕реНрдЯреЗрдб рдХреНрд╡реЗрд░реА рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, SpecificationExtension рд╡рд░реНрдЧ рднреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВред

рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЬреБрдбрд╝рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╕рдВрдЧрддрд┐ ("рдФрд░" рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдФрд░ "рдпрд╛" рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЬреБрдбрд╝рдирд╛ред

рдЖрдЗрдП рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдЕрдкрдиреЗ рджреЛ рдирд┐рдпрдореЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:

 public class CreatedAfter: Specification<Character> { public CreatedAfter(DateTime target) { Query = Source().Where(x => x.CreatedAt > target); } } public class CreatedBefore: Specification<Character> { public CreatedBefore(DateTime target) { Query = Source().Where(x => x.CreatedAt < target); } } 

рдФрд░ рдЙрди рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЦреЛрдЬреЗрдВ рдЬреЛ рджреЛрдиреЛрдВ рдирд┐рдпрдореЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ:

 var specification = new CreatedAfter(new DateTime(2019, 1, 1).Combine(new CreatedBefore(new DateTime(2020, 1, 1)); var users = repository.List(specification); 

рдХрдВрдмрд╛рдЗрди рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдордирдорд╛рдиреЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдмрд╛рдИрдВ рдУрд░ рдХрд╛ рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рдХрд╛рд░ рджрд╛рдПрдВ рдкрдХреНрд╖ рдХреЗ рдЗрдирдкреБрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рдЕрдиреБрдорд╛рдиреЛрдВ рдХреЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкреГрд╖реНрдард╛рдВрдХрди рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝реЗрдВ / рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдирд┐рдпрдореЛрдВ рдХреЛ рдЫрд╛рдВрдЯ рд╕рдХрддреЗ рд╣реИрдВ, рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрджрд┐ред

рдпрд╛ рдирд┐рдпрдо рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдмрдВрдзрдХ рд╣реИ - рдпрд╣ рдХреЗрд╡рд▓ рдЙрди рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рд╣рдореЗрдВ реирежрежреж рд╕реЗ рдкрд╣рд▓реЗ рдпрд╛ реирежреиреж рдХреЗ рдмрд╛рдж рдмрдирд╛рдП рдЧрдП рд╕рднреА рдкрд╛рддреНрд░ рдорд┐рд▓рддреЗ рд╣реИрдВ:

 var specification = new CreatedAfter(new DateTime(2020, 1, 1).Or(new CreatedBefore(new DateTime(2000, 1, 1)); var users = repository.List(specification ); 

IQuery рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рдлреА рд╣рдж рддрдХ IQueryable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рд╢реНрди рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ:

Fetch / ThenFetch - рдЖрдкрдХреЛ рдЕрдиреБрдХреВрд▓рди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдХреНрд╡реЗрд░реА рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рдереЛрдбрд╝рд╛ рдЯреЗрдврд╝рд╛ рд╣реИ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдирд┐рдпрдореЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХрдареЛрд░ рдФрд░ рд╢реБрджреНрдз рд╕рд╛рд░ рд╣реИ - рдпрд╣ рдПрдХ рдмрд▓реНрдХрд┐ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЪреАрдЬ рд╣реИред

рдЬрд╣рд╛рдВ - IQuery рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рджреЛ рдЕрдзрд┐рднрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рд▓рдВрдмреЛрджрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд▓реЗрддрд╛ рд╣реИ <Func <T, bool >> , рдФрд░ рджреВрд╕рд░рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ IQueryContext рдореЗрдВ рднреА рд▓реЗрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдиреЗрд╕реНрдЯреЗрдб рдЙрдкрд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореЙрдбрд▓ рдореЗрдВ ReadCharacter рд╡рд░реНрдЧ рд╣реИ - рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХреЛ рдПрдХ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрд╕рд╛рдорд╛рдиреНрдп рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рддреНрд╡рд░рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд▓рд┐рдЦрд┐рдд рднрд╛рдЧ рдЬрд┐рд╕рдореЗрдВ рд▓рд┐рдВрдХ, рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдбреЗрдЯрд╛ рдЖрджрд┐ рд╣реЛрддреЗ рд╣реИрдВред рд╣рдо рдЙрди рд╕рднреА рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЛрдореЗрди рдкрд░ рдореЗрд▓ рд╣реИред

 public class CharactersForUserWithEmailDomain: Specification<ReadCharacter> { public CharactersForUserWithEmailDomain(string domain) { var usersQuery = Source<User>(x => x.Email.Contains(domain)).Projection(x => x.Id); Query = Source().Where((x, ctx) => ctx.GetQueryResult<int>(usersQuery).Contains(x.Id)); } } 

рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд sql рдХреНрд╡реЗрд░реА рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреА:

 select readcharac0_.id as id1_3_, readcharac0_.UserId as userid2_3_, readcharac0_.Name as name3_3_ from ReadCharacters readcharac0_ where readcharac0_.UserId in ( select user1_.Id from Users user1_ where user1_.Email like ('%'+@p0+'%') ); @p0 = '@inmagna.ca' [Type: String (4000:0:0)] 

рдЗрди рд╕рднреА рдЕрджреНрднреБрдд рдирд┐рдпрдореЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, IRepository рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рдЬреЛ рдЖрдкрдХреЛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЖрдЗрдЯрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ (рдкрд╣рд▓реА рдЙрдкрдпреБрдХреНрдд) рдпрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдЖрдЗрдЯрдореЛрдВ рдХреЛ рд╕рд╣реЗрдЬрддрд╛ рдФрд░ рд╣рдЯрд╛рддрд╛ рднреА рд╣реИред
рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛, рдЕрдм рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ ORM рдХреЛ рдкрдврд╝рд╛рдирд╛ рдмрд╛рдХреА рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо Singularis.Infrastructure.NHibernate (ef.core рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ ef.core рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде) рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред

рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдкреНрд╡рд╛рдЗрдВрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдЬреЛ IRepository рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╡рд╕реНрддреБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рднрдВрдбрд╛рд░рдг (рдмрдЪрдд / рд╣рдЯрд╛рдиреЗ) рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╡рд░реНрдЧ рдПрдХ рд╕рддреНрд░ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ рдФрд░ рд╡реНрдпрд╛рдкрд╛рд░ рдкрд░рдд рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЫрд┐рдкрд╛рддрд╛ рд╣реИред рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ IQueryable рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ IQuery рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣рдорд╛рд░реА рдХреНрд╡реЗрд░реА рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╕рддреНрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдореБрдЦреНрдп рдЬрд╛рджреВ рдФрд░ рд╕рдмрд╕реЗ рдмрджрд╕реВрд░рдд рдХреЛрдб IQuery рдХреЛ IQueryable - SpecificationExecutor рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╡рд░реНрдЧ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ ORM (EiberFetchingExtensionsMethods for NHiberante) рдХреЗ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдпреЛрдЧреНрдп рддрд░реАрдХреЛрдВ рдпрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВред

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

рд╡рд░реНрдгрд┐рдд рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдХрдм рд╣реИ? "рдЬрдм рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП" рд╕рд╡рд╛рд▓ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╢рд╛рдпрдж рдЖрд╕рд╛рди рд╣реИ:

  • highload - рдпрджрд┐ рдЖрдкрдХреЛ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ ORM рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрд╡рдпрдВ рдПрдХ рдкреНрд░рд╢реНрди рдЙрдард╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреЛрдИ рднреА рдПрдХ рдирд┐рд╖реНрдкрд╛рджрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрд╕рдХреНрдпреВрдПрд▓ рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ ...
  • рдмрд╣реБрдд рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ - рдпрд╣ рдмрд╣реБрдд рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╣реИ, рд▓реЗрдХрд┐рди, рдЖрдкрдХреЛ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ ORM рдФрд░ рдкреВрд░реЗ рд╕рд╛рде рдХреЗ рдЪрд┐рдбрд╝рд┐рдпрд╛рдШрд░ рдХреЛ "рдЯреВрдбреВ рд▓рд┐рд╕реНрдЯ" рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЦреАрдВрдЪрдХрд░, рдПрдХ рддреЛрдк рд╕реЗ рдЧреМрд░реИрдпрд╛ рдХреА рд╢реВрдЯрд┐рдВрдЧ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрд┐рд╕рдиреЗ рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХреА - рдЕрдкрдиреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ!

рдореИрдВ рд▓рдЧрднрдЧ рднреВрд▓ рдЧрдпрд╛ - рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб GitHub'e - https://github.com/SingularisLab/singularis.specification рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ

рдЕрд╕реЗрдВрдмрд▓реА nuget рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВ

Source: https://habr.com/ru/post/hi485328/


All Articles