рдкрд╣рд▓реЗ рднрд╛рдЧ рдХрд╛ рд▓рд┐рдВрдХрджреВрд╕рд░реЗ рднрд╛рдЧ рдХрд╛ рд▓рд┐рдВрдХрд╕рд╛рдордЧреНрд░реА рдФрд░ рдХрдВрдЯреЗрдирд░ рдЯреАрдо
рдХреБрдЫ рдЖрджреЗрд╢реЛрдВ рдореЗрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдкреИрдХреЗрдЬ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрди рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдкреИрдХреЗрдЬ (рдФрд░ рдЕрдзрд┐рдорд╛рдирддрдГ, рдкреИрдХреЗрдЬ рдХреЗ рдЕрдВрджрд░ рд╕рд╣реА) рдкреИрдХреЗрдЬ рдХреЗ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдПрдХ рд╕рд╛рде рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд╣рд▓реЗ, рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ PackageBilder рд╢реНрд░реЗрдгреА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо PackageBody рддрд░реНрдХ рдХреЛ рдирд╛рдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдорд╛рдВрдб рдХрдорд╛рдВрдб, рдЬреЛ рдкреИрдХреЗрдЬ рдХрдорд╛рдВрдб рдЯреНрд░реА рдХрд╛ рд░реВрдЯ рдиреЛрдб рд╣реИред PackageBuilder рд╡рд░реНрдЧ рдХреЗ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреА SaveResult () рд╡рд┐рдзрд┐ рдХреЛ рдкреВрд░реЗ рдЯреНрд░реА рдХреЛ рдкреБрди: рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЙрди рдЖрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕реНрдерд┐рдд рд╕рд╛рдордЧреНрд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрди рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреИрдХреЗрдЬ рдмреЙрдбреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ рдкреИрдХреЗрдЬ рдмреЙрдбреА рдореЗрдВ рдПрдХ xml рдлрд╝рд╛рдЗрд▓ рднреА рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рдкреИрдХреЗрдЬрдмреЙрдбреА рдХреЛ рдкреИрдХреЗрдЬ рдХреЗ рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рдФрд░ рдЙрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
SaveResult () рдореЗрдердб рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рд░реАрд╕рд░реНрдЪрд▓реА рдХрдорд╛рдВрдб рдЯреНрд░реА рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдВрдЯ рдХрдорд╛рдВрдб рдореЗрдВ рдРрд╕реА рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдкреИрдХреЗрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ? рдпрджрд┐ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдЫрджреНрдо рдХреЛрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рд╕рд░рд▓ рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ: "рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдХрдорд╛рдВрдб CreateFile рд╣реИ, рддреЛ рд╣рдо SourceFile рдХреЛ рдЗрд╕рдореЗрдВ рд╕реЗ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ", рддреЛ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдореЗрдВ рдпрд╣ рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ PackageBuilder рд╡рд░реНрдЧ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рддрдХ рдкрд╣реБрдБрдЪ рдХреЗ рдмрд┐рдирд╛, рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдбреЗрд╡рд▓рдкрд░ рдЕрдм рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЕрдкрдиреА рдирдИ рд╕рд╛рдордЧреНрд░реА рдЯреАрдо рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рдЬрд╛рдВрдЪ рдЬреЛрдбрд╝реЗрдВред рдпрд╣рд╛рдБ, рд╣рдореЗрдВ ContentCommand рдЬреИрд╕реЗ рдПрдХ рдФрд░ рд╕рд╛рд░ рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдорджрдж рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬрд╣рд╛рдБ рд╕реЗ рд╣рдо рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдХрдорд╛рдВрдб рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдХрд╣рд╛рдБ рдмрдирд╛рдПрдБрдЧреЗ? рд╡рд░реНрддрдорд╛рди рдореЗрдВ, CreateFile рдХрдорд╛рдВрдб TransactionalCommand рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИ, рдФрд░ CreateFile рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдордЧреНрд░реА рдХрдорд╛рдВрдб рднреА рд╣реИред рд▓реЗрдХрд┐рди WriteRegistry рднреА TransactionalCommand рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рд▓рд┐рдЦрддрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдБ, рд╡реИрд╕реЗ, WriteRegistryFileCommand рдХрдорд╛рдВрдб рднреА рдПрдХ TransactionalCommand рд╣реИ, рдФрд░ рд╕рд╛рде рд╣реА рдпрд╣ рд╕рд╛рдордЧреНрд░реА рднреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ * .reg рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдПрдХ рдлрд╛рдЗрд▓ рдЬреЛ рд╕рднреА рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд╣рд╛рдБ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ ContentCommand рд╡рд░реНрдЧ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ C # рдЕрд╢реБрджреНрдзрддрд╛ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ C ++ (рд╕реНрд░реЛрдд) рдореЗрдВ рд╣реИ, рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдПрдХ рдирдпрд╛ IContentCandand рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреЗрд╢ рдХрд░рдХреЗ рд╣рд▓ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдордЧреНрд░реА рдХрдорд╛рдВрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╣реИред
IContentCommand рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд╣рд▓реЗ рд╕рдиреНрдирд┐рдХрдЯрди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ:
public interface IContentCommand { string ContentPath { get; set; } }
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдПрдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдЧреЗрдЯреНрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рджреЛрдиреЛрдВ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдкреИрдХреЗрдЬ рдбреЗрд╡рд▓рдкрд░ рдорд╢реАрди рдкрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдкрде рдХреЗ рдореВрд▓ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рддреИрдпрд╛рд░ рдкреИрдХреЗрдЬ рдХреЗ рдЕрдВрджрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЗ рд╕рд╛рде рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреИрдХреЗрдЬ рдЙрдкрднреЛрдХреНрддрд╛ рдХреА рдорд╢реАрди рдкрд░, рдЯреАрдо рдкреИрдХреЗрдЬ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрдирдХреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рд╕реЗ рдкреИрдХреЗрдЬ рдХреЗ рдЕрдВрджрд░ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧреАред рдФрд░ рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ, рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рдкрд╛рд╕ рдбреЗрд╡рд▓рдкрд░ рдХреА рдорд╢реАрди рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЙрд╕реЗ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдкрде рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдХреА рдорд╢реАрди рдкрд░ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреА рд╕рдВрд░рдЪрдирд╛ред
рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдордЧреНрд░реА рдЯреАрдо рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, CreateFile рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:
public string ContentPath { get { return SourcePath; } set { SourcePath = value; } }
рдпрд╣ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд╕рд╛рдордЧреНрд░реА рдЯреАрдо рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рджрд┐рдЦреЗрдЧрд╛ред
IContentCommand рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкрде рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдпрд╛рдиреА рдПрдХ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рд╕рд╛рдеред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдХрдорд╛рдВрдб рдореЗрдВ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рдлрд╛рдЗрд▓ рдпрд╛ рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реЛрдВ? рддрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
interface IMultipleContentCommand { IEnumerable<ContentPath> ContentPaths { get; } }
рдЕрдм, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп, рдореБрдЭреЗ ContentPath рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдерд╛ рдЬреЛ рд╕реНрд╡рд╛рдореА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЯрд╛рдЗрдк рд░рд┐рдлреНрд▓реЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖ рд╕рдХрд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ ContentPath рдкреНрд░рдХрд╛рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛:
public class ContentPath { private Command _command; private PropertyInfo _property; public ContentPath(Command command, PropertyInfo property) { if (!(command is IMultipleContentCommand)) { throw new ArgumentException("Must be the IMultipleContentCommand"); } _command = command; _property = property; } public string Name { get { return _property.Name; } } public string Value { get { return (string)_property.GetValue(_command, null); } set { _property.SetValue(_command, value, null); } } }
рдпрд╣рд╛рдБ рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл рдорд▓реНрдЯреА-рдХрдВрдЯреЗрдВрдЯ рдЯреАрдо рдмрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рджрд┐рдЦрд╛рдИ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдореИрдВ рдРрд╕реА рдХрд┐рд╕реА рднреА рдЯреАрдо рдХреА рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ, рдЬрд┐рд╕рдореЗрдВ рдРрд╕реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ (рдЯреАрдо рдЬреЛ рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реЛ, рдореИрдВ рд╕рд╛рдзрд╛рд░рдг рд╕рд╛рдордЧреНрд░реА рдЯреАрдореЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБ рдЬреЛ рдПрдХ рдПрдХрд▓ рдкрде рд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддреА рд╣реИрдВ) рдФрд░ рдЗрд╕рд▓рд┐рдП, IMultipleContentCommand рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗрд╡рд▓ рдЕрднреА рдХреЗ рд▓рд┐рдП рдорд╕реМрджрд╛ рдкреНрд░рддрд┐рдпреЛрдВ рдореЗрдВ рд░рд╣реЗрдЧрд╛, рдореИрдВ рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдмрд┐рдирд╛ рдЖрд╡реЗрджрди рд╡рд░реНрдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рдХрд┐рдПред
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдкреИрдХреЗрдЬ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП PackageBuilder рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рддрдХ, рд╡рд╣ рдХреЗрд╡рд▓ рдПрдХ XML рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдкреИрдХреЗрдЬ рдмреЙрдбреА рдереА рдЬрд┐рд╕рдореЗрдВ рдХрдорд╛рдВрдб рдЯреНрд░реА рд╢рд╛рдорд┐рд▓ рдерд╛ред рдЬрдм рд╣рдореЗрдВ рдкреИрдХреЗрдЬ рдореЗрдВ рди рдХреЗрд╡рд▓ XML рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ, рдмрд▓реНрдХрд┐ рдмрд╛рдХреА рд╕рд╛рдордЧреНрд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рднреА рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдореЗрдВ PackageBuilder рд╡рд░реНрдЧ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдм рд╡рд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:
- рдкреИрдХреЗрдЬ рдХрдорд╛рдВрдб рд╡рд╛рд▓реЗ XML рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛
- рдореВрд▓ рд░реВрдк рд╕реЗ рдкреИрдХреЗрдЬ рдбреЗрд╡рд▓рдкрд░ рдХреА рдорд╢реАрди рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рд╕рдорд╛рд╡реЗрд╢
- рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ред
рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдЧреНрд░рд╣ (рдЬрд╝рд┐рдк, рдЖрд░рдПрдЖрд░, рдЯрд╛рд░ рдпрд╛ рдХреБрдЫ рдФрд░) рдкрд░ рд╕реАрдзреЗ рдмрд┐рдЫрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдореИрдВ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдПрдХ рдЕрд▓рдЧ PackageContent рд╡рд░реНрдЧ рдореЗрдВ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рддрд╛ рд╣реВрдВред

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

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдкреИрдХ рдХрд░рдиреЗ рдХреА рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рд░ рдЖрд░реНрдХрд╛рдЗрд╡рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдореИрдВ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рд▓реЗрдЦ рдХрд╛ рдЕрд░реНрде рдЗрди рд╡рд┐рд╡рд░рдгреЛрдВ рдореЗрдВ рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдиреЛрдЯ рдХрд░рддрд╛ рд╣реВрдВред рдкреИрдХреЗрдЬ рдмрдирд╛рддреЗ рд╕рдордп, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рд╕рд╛рдордЧреНрд░реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрдорд╛рдВрдбреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЕрдкрдиреА рд╕рдорд╛рди рдкреНрд░рддрд┐рдпреЛрдВ рдХреЛ рдкреИрдХреЗрдЬ рдХреЗ рдЕрдВрджрд░ рди рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдкреИрдХреЗрдЬрдХреЙрдиреНрдЯреЗрдВрдЯ рдиреЗ рдЙрд╕рдореЗрдВ рднрд░реА рд╣реБрдИ рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд░рдЦреА рд╣реЛ, рдФрд░ рд╣рдореЗрд╢рд╛ рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд╕рдХреЗ - рдХреНрдпрд╛ рдореЗрд░реЗ рдЕрдВрджрд░ рдкрд╣рд▓реЗ рд╕реЗ рдХреЛрдИ рдлрд╛рдЗрд▓ рд╣реИ? рдпрд╣ рдЬрд╛рдБрдЪ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкреВрд░реНрдг рдкрде рдХреА рд╕рдорд╛рдирддрд╛ рдкрд░ рдХреА рдЬрд╛рдПрдЧреАред рдФрд░ рдПрдХ рдЯрд┐рдкреНрдкрдгреАред рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рд╕реЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреИрдХреЗрдЬ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рдеред рдЪреВрдВрдХрд┐ рдлрд╝рд╛рдЗрд▓ рдкрджрд╛рдиреБрдХреНрд░рдо рдореМрдЬреВрдж рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ (рдпрд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреА рд╣реИ, рдпрд╛ рдирд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддреА), рдкреИрдХреЗрдЬ рдХреЗ рдЕрдВрджрд░ рдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдирдП рдЙрддреНрдкрдиреНрди рдирд╛рдореЛрдВ рдХреЗ рддрд╣рдд рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдЧрд╛рдЗрдб рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ, рддрд╛рдХрд┐ рдкреИрдХреЗрдЬ рдХреЗ рдЕрдВрджрд░ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рди рд╣реЛрдВред рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдФрд░ рдЗрд╕реЗ рдПрдХ рдирдП рдирд╛рдо рдХреЗ рддрд╣рдд рдкреИрдХреЗрдЬ рдХреЗ рдЕрдВрджрд░ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХрдорд╛рдВрдб рдореЗрдВ рдореВрд▓ рдкрде рдХреЛ рдПрдХ рдирдП рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
PackageBuilder рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдХрдорд╛рдВрдб рдореЗрдВ рдХрдорд╛рдВрдб рдПрдореНрдмреЗрдбреЗрдб рд╣реИ, рд╣рдо рдЗрд╕реЗ рдмрдирд╛рдПрдВрдЧреЗ рддрд╛рдХрд┐ рд╕рднреА рдХрдорд╛рдВрдб (рдЙрдиреНрд╣реЗрдВ рдХрдВрдЯреЗрдирд░ рдХрд╣рддреЗ рд╣реИрдВ) рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рдХрдорд╛рдВрдб рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡реЗ IContainerCommand рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рдХрд╛ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
public interface IContainerCommand { IEnumerable<Command> InnerCommands { get; } }
рдХрдВрдЯреЗрдирд░ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рддреБрдЪреНрдЫ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, CommandSequence рдмрд╕ рдЕрдкрдиреА рдХрдорд╛рдиреЛрдВ рдХреА рд╕рдВрдкрддреНрддрд┐ рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛:
public IEnumerable<Command> InnerCommands { get { return Commands; } }
рдФрд░ ExecuteIf рдПрдХ рдПрдХрд▓ рдХрдорд╛рдВрдб рдХрдорд╛рдВрдб рд╕реЗ рдорд┐рд▓рдХрд░ рдПрдХ рд╕реВрдЪреА рд▓реМрдЯрд╛рдПрдЧрд╛:
public IEnumerable<Command> InnerCommands { get { return new List<Command>() { Command }; } }
рдореИрдВ рдЕрдм рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЗрд╕рдХреА рд╕рдЯреАрдХ рд╕рдордЭ рдХреЗ рд▓рд┐рдП SaveResult рдФрд░ ProcessIncludedFiles рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдХреЛрдб рджреЗрдЧрд╛:
public const string MAIN_PACKAGE_FILENAME = "package.xml"; public const string PACKAGE_FILE_EXTENSION = ".gin"; public const string PACKAGE_CONTENT_FILE_EXTENSION = ".cnt"; public void SaveResult(string filePath) { ProcessIncludedFiles(_body.Command); string xmlFilePath = GinSerializers.PackageBodySerializer.Serialize(_body); _content.AddContent(xmlFilePath, MAIN_PACKAGE_FILENAME); _content.SaveAs(filePath); } private void ProcessIncludedFiles(Command command) { if (command is IContainerCommand) { IContainerCommand iContainer = (IContainerCommand)command; foreach (Command cmd in iContainer.InnerCommands) { ProcessIncludedFiles(cmd); } } if (command is IContentCommand) { IContentCommand cntCommand = (IContentCommand)command; string sourceFilePath = cntCommand.ContentPath; if (!_content.ContainFilePath(sourceFilePath)) { string destFileName = GetGuidContentFileName(); _content.AddContent(sourceFilePath, destFileName); cntCommand.ContentPath = destFileName; } else { string destFileName = _content.GetFileName(sourceFilePath); cntCommand.ContentPath = destFileName; } } } private string GetGuidContentFileName() { return Guid.NewGuid().ToString("N") + PACKAGE_CONTENT_FILE_EXTENSION; }
рдмрд╕ рдКрдкрд░, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИред
рддреБрд▓рдирд╛рддреНрдордХ рд╕рдВрдЪрд╛рд▓рдХ
рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рджреЗрдЦрд╛ред рдпрд╣рд╛рдВ рдореИрдВ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, ExecuteIf рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдВрджрд░реНрдн (ExecutionContext) рдореЗрдВ рдмреВрд▓рд┐рдпрди рдЪрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рджреЛ рдСрдкрд░реЗрдВрдб рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред рдЗрди рдСрдкрд░реЗрдВрдбреЛрдВ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ (рдЗрдВрдЯ, рдбрдмрд▓, рдЖрджрд┐) рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░ рд╕реНрд╡рдпрдВ, рдмрджрд▓реЗ рдореЗрдВ, рдЕрд▓рдЧ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рд▓реЗрд╕рдерди, рдЧреНрд░реЗрдЯрд░рдерди, рдЗрдХреНрд╡рд▓, рдЗрддреНрдпрд╛рджрд┐), рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдЯ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдкрд░реЗрдВрдбреНрд╕ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯрд╛рд░реНрдЯ-рдореИрде рдСрдкрд░реЗрдЯрд░ рд╢рд╛рдпрдж рд╣реА рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХрд░рдиреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдЯреАрдо рдмрдирд╛рдирд╛ рдЬреЛ рдСрдкрд░реЗрдВрдбреНрд╕ рдХреА рддреБрд▓рдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдмрд╣реБрдд рд╣реА рдЧреИрд░-рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЯреАрдо рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреА рд╣рдорд╛рд░реА рдЗрдЪреНрдЫрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рддрд╛рдХрд┐ рдЕрдВрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЕрдкрдиреЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдореВрд▓ рд╕реЗрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХреЗред
рдкрд╣рд▓рд╛, рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ, рддреБрд▓рдирд╛рддреНрдордХ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдорд╛рдВрдб рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
рд╕реНрдЯреНрд░рд┐рдВрдЧ FirstOperandName,
рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреВрд╕рд░рд╛рдСрдкрд░реИрдВрдбрдирд╛рдо,
рддреБрд▓рдирд╛рдСрдкрд░реЗрд╢рди рдСрдкрд░реЗрд╢рдиред
рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
public enum CompareOperation { Equals, GreaterThan } public class StringCompareCommand : Command { public string FirstOperandName { get; set; } public string SecondOperandName { get; set; } public CompareOperation Operation { get; set; } private ExecutionContext _context; public StringCompareCommand(ExecutionContext context) { _context = context; } public override void Do() { bool compareResult = false; int firstOperand = (int)_context.GetResult(FirstOperandName); int secondOperand = (int)_context.GetResult(SecondOperandName); switch (Operation) { case CompareOperation.Equals: compareResult = firstOperand == secondOperand; break; case CompareOperation.GreaterThan: compareResult = firstOperand < secondOperand; break; } _context.SaveResult(ResultName, compareResult); } }
рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рджреЛ рддреБрд▓рдирд╛рддреНрдордХ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдПред рддрджрдиреБрд╕рд╛рд░, рдпрджрд┐ рд╣рдо рджрд╢рдорд▓рд╡ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо DecimalCompareCommand рд╡рд░реНрдЧ рдХреЛ рдХрдорд╛рдВрдб рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ, рдЬреЛ рдХрд┐ (рджрд╢рдорд▓рд╡) рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝рдХрд░ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ IntCompareCommand рд╡рд░реНрдЧ рдХреЛ рджреЛрд╣рд░рд╛рдПрдЧрд╛ред рдФрд░ рдЕрдЧрд░ рд╣рдо рдЙрдирдХреЗ рд╕рд╛рде рд▓реЗрдерди рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ Do () рд╡рд┐рдзрд┐ рдХреЗ рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рджреЛ рд╡рд░реНрдЧреЛрдВ IntCompareCommand, DecimalCompareCommand рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдореБрдЭреЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдирд╛рдкрд╕рдВрдж рд╣реИ? рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдЯрд░реНрди рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ - рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХрд╛ рдХреЛрдб рдЖрдо рддреМрд░ рдкрд░ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИред рддреБрд▓рдирд╛рддреНрдордХ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдирдП рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреГрддреАрдп-рдкрдХреНрд╖ рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рдЕрд╕рдорд░реНрдерддрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреЙрд▓реАрдореЛрд░реНрдлрд┐рдЬрд╝реНрдо рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдЬреАрд╡рди рдореЗрдВ рд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рд╕рдордп рдХреЗ рд╕рд╛рде рджреЛ рдкрд╣рд▓реВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ - рдСрдкрд░реЗрдВрдбреНрд╕ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдСрдкрд░реЗрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░, рдЗрди рдкрд╣рд▓реБрдУрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрдиреНрд╣реЗрдВ рдХрдореНрдкреЗрд░рд┐рдорд╛рдВрдб рдФрд░ рддреБрд▓рдирд╛рдСрдкрд░реИрдВрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
public abstract class CompareCommand: Command { public string FirstOperandName { get; set; } public string SecondOperandName { get; set; } public override void Do(ExecutionContext context) { bool result = Compare(Subtract(context)); context.SaveResult(ResultName, result); } protected abstract bool Compare(int compareResult); private int Subtract(ExecutionContext context) { CompareOperand firstOperand = CompareOperand.Create(context.GetResult(FirstOperandName)); CompareOperand secondOperand = CompareOperand.Create(context.GetResult(SecondOperandName)); return (firstOperand - secondOperand); } }
рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рд╣реИрдВ:
- рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЙрдирдХреЗ рдирд╛рдо рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рджреЛ рддрд░реНрдХ,
- Do (ExecutionContext) рд╡рд┐рдзрд┐, рдЬреЛ рджреЛ рдорд╛рддреНрд░рд╛рдУрдВ (рдШрдЯрд╛рд╡ рд╡рд┐рдзрд┐) рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЗ рд╕рдВрдХреЗрдд рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рддреБрд▓рдирд╛ рдХрд░рддреА рд╣реИ, рдФрд░ рдЗрд╕ рд╕рдВрдХреЗрдд рдХреЛ рдЕрдореВрд░реНрдд рддреБрд▓рдирд╛ (рдЗрдВрдЯ) рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╛рд╕ рдХрд░рддреА рд╣реИред рд╣рдо рддреБрд▓рдирд╛ рд╡рд┐рдзрд┐ рдХреЗ рдареЛрд╕ рд╡рдВрд╢рдЬреЛрдВ рдореЗрдВ рддреБрд▓рдирд╛ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
- рд╕рд╛рд░ рддреБрд▓рдирд╛ (int) рд╡рд┐рдзрд┐
- рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдмрдЯреНрд░реЗрдХреНрдЯ рд╡рд┐рдзрд┐ рдЬреЛ рд╕рдВрджрд░реНрдн рд╕реЗ рджреЛ рдСрдкрд░реЗрдВрдб рдХреЛ рдирд┐рдХрд╛рд▓рддреА рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХреЗ рд╡рдВрд╢рдЬреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИред рддреБрд▓рдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ, рдФрд░ рдлрд┐рд░ рдПрдХ рдХреЛ рджреВрд╕рд░реЗ рд╕реЗ рдШрдЯрд╛рддреА рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдВ рднреА рдмрд╣реБрд░реВрдкрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдВрдЧреЗ:
public class CompareLessThan : CompareCommand { protected override bool Compare(int compareResult) { return compareResult < 0; } }
рдЕрдм рд╣рдо рддреБрд▓рдирд╛ рдХрдХреНрд╖рд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:
public abstract class CompareOperand { public static CompareOperand Create(object operand) { if (operand is ulong) { return new ULongCompareOperand() { Value = (ulong)operand }; } .. .. .. .. .. .. .. .. .. return new DefaultCompareOperand() { Value = (DefaultType)operand }; } public static int operator -(CompareOperand operand1, CompareOperand operand2) { return operand1 - operand2; } }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрдЯреИрдЯрд┐рдХ рдХреНрд░рд┐рдПрдЯ рд╡рд┐рдзрд┐, рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рддрд░реНрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдХрдВрдкреЗрд░рд┐рдЬрди рдХреНрд▓рд╛рд╕ рдХреЗ рд╡рдВрд╢рдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рднреА рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдХреЗрд╡рд▓ рдореВрд▓реНрдп рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдШрдЯрд╛рд╡ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрдВрдЧреЗред
рдФрд░ рдЙрд╕рдХреЗ рд╡рд╛рд░рд┐рд╕ рдЗрд╕ рддрд░рд╣ рд╣реЛрдВрдЧреЗ:
public class LongCompareOperand : CompareOperand { public long Value { get; set; } public static int operator -(LongCompareOperand operand1, LongCompareOperand operand2) { return Math.Sign(operand1.Value - operand2.Value); } }
рдпреЛрдЬрдирд╛ рд╕реБрдВрджрд░ рджрд┐рдЦрддреА рд╣реИ рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдШрдЯрд╛рд╡ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрд░реВрдкрддрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА (рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐ рдЖрднрд╛рд╕реА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдмрд╣реБрд░реВрдкрддрд╛ рдЗрд╕рдХреЗ рд╕рдореНрдорд╛рди рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛)ред VisualStudio рдиреЗ рддреБрд░рдВрдд рдПрдХ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдпрд╛ - рдШрдЯрд╛рд╡ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛, рдХреНрдпреЛрдВрдХрд┐ рддреБрд▓рдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдШрдЯрд╛рд╡ рдХреЛ рд╕реНрд╡рдпрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рдмрд╣реБрд░реВрдкрд┐рдХ рдШрдЯрд╛рд╡ рдСрдкрд░реЗрдЯрд░ред рдареАрдХ рд╣реИ, рд╣рдо рдШрдЯрд╛рд╡ "-" рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдШрдЯрд╛рд╡ () рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВред
public abstract class CompareOperand { public static CompareOperand Create(object operand) { return new DefaultCompareOperand() { Value = (DefaultType)operand }; } public abstract int Subtract(CompareOperand operand2); public static int operator -(CompareOperand operand1, CompareOperand operand2) { return operand1.Subtract(operand2); } } public class LongCompareOperand : CompareOperand { public long Value { get; set; } public override int Subtract(CompareOperand operand2) { return Math.Sign(this.Value - ((LongCompareOperand)operand2).Value); } }
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдореБрдЭреЗ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рд╡рд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдСрд░рд┐рдЬрдирдСрдкрд░реИрдВрдб.рдХреНрд░рд┐рдПрдЯ () рдкрджреНрдзрддрд┐ рдореЗрдВ рдЕрдиреНрдп рд╕реНрдЯреЗрдЯрдореЗрдВрдЯреНрд╕ рдХреА рдЪреЗрди рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рддрдХ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдерд┐рддрд┐ рдХреЛ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЕрдм, рдпрджрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдВрдб рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рддреБрд▓рдирд╛рдУрдкрд░реИрдВрдб рд╡рд░реНрдЧ рд╕реЗ рд╡рдВрд╢ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдПрдХ рдФрд░ рдЬреЛрдбрд╝реЗрдВ (рдмрдирд╛рдПрдВ) рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП, рдЬреЛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрднрд╡ рд╣реИ, рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рд╕реНрд░реЛрдд рдХреЛрдб рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред рдПрдХ рддреБрд▓рдирд╛ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдкрд░реЗрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЕрдкрд╡рд╛рдж рднреА рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореИрдВ рдЕрдм рддрдХ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ, рд▓рдЪреАрд▓реЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдпрд╛рдж рд░рдЦрдирд╛ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рджреБрд╢реНрдорди рдХрд╛ рджреБрд╢реНрдорди рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ CLR рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╕рднреА рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЕрдВрддрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЧреИрд░-рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рднреА рдкреВрд░рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдВрддрд░ рдСрдкрд░реЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдбреЗрдЯрд╛рдЗрдоред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдмреНрд▓реЙрдЧ рдкрд░ рдореМрдЬреВрдж рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдбреЗрдЯрд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЗрд╖реНрдЯрддрдо рд╡рд┐рдзрд┐ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдВрдЧреЗред
рдЪреМрдереЗ рднрд╛рдЧ рдХрд╛ рд▓рд┐рдВрдХ