рдСрдмреНрдЬреЗрдХреНрдЯ рдУрд░рд┐рдПрдВрдЯреЗрдб рдЬрд┐рди рдЗрдВрд╕реНрдЯреЙрд▓рд░ рд╡рд┐рдХрд╛рд╕

рдкрд╣рд▓реЗ рднрд╛рдЧ рдХрд╛ рд▓рд┐рдВрдХ
рджреВрд╕рд░реЗ рднрд╛рдЧ рдХрд╛ рд▓рд┐рдВрдХ
рддреАрд╕рд░реЗ рднрд╛рдЧ рдХрд╛ рд▓рд┐рдВрдХ

рдбреЗрдЯрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐



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

рд╣рдо рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдирдкреБрдЯ рдлреЙрд░реНрдо рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

public class UserInputCommand: Command { public List<UserInputControl> InputControls { get; set; } public string FormCaption { get; set; } public override void Do(ExecutionContext context) { foreach (UserInputControl input in InputControls) { Control control = input.Create(); //       context.InputForm.Controls.Add(control); } } } 

рд╣рдордиреЗ InputControl рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЬреЛрдбрд╝рд╛ (рдореБрдЭреЗ рдЕрднреА рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдХрд╣рд╛рдВ рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛), рдпрд╣ рдПрдХ рдХрдВрдЯреЗрдирд░ рдирд┐рдпрдВрддреНрд░рдг рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рдпрдВрддреНрд░рдг рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред
UserInputControl рд╡рд░реНрдЧ рднреА рд╕рд╛рд░ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдБ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛:
 public abstract class UserInputControl { public string ResultName { get; set; } public int Height { get; set; } public abstract Control Create(); } 

рдпрд╣ рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╣рдо рд╕рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЛ рд╡рд╛рд░рд┐рд╕ рдХрд░реЗрдВрдЧреЗ, рдЬреИрд╕реЗ рдХрд┐ UserInputTextBox - рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рдВрдкрд░реНрдХ рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб:
 public class UserInputTextBox : UserInputControl { public string Caption { get; set; } public string InitialValue { get; set; } public override Control Create() { TextBox textbox = new TextBox(); return control; } } 

рдпрд╣ рд╕рд┐рд░реНрдл рд╕рд░рд▓реАрдХреГрдд рдХреЛрдб рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЯреЗрдХреНрд╕реНрдЯ рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд▓реЗрдмрд▓ рднреА рд╣реЛрдЧрд╛ рдЬреЛ рдХреИрдкреНрд╢рди рд╣реЗрдбрд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрди рджреЛ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЛ рдкреИрдирд▓ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрд░рд┐рдПрдЯ рд╡рд┐рдзрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдВрдЧреЗред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░, UserInputControl рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд╣рдо рдЕрдиреНрдп рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдПрдВрдЧреЗред
рд╕рд╛рде рд╣реА, рдЗрдирдкреБрдЯ рдлреЙрд░реНрдо рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЗ рдЕрдВрдд рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрдЧрд▓реЗ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдореБрдЦреНрдп рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ред
рдХреНрд░рдордмрджреНрдзрддрд╛
рдореИрдВрдиреЗ XML рдХреНрд░рдорд╛рдВрдХрди рдкреНрд░рд╛рд░реВрдк рдЪреБрдирд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдиреЗрдЯ рдордВрдЪ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИред рдореИрдВ System.Xml.Serialization.XmlSerializer рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдБрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рдХрд╛рд░рдг, рдЗрд╕рдореЗрдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдХреЗрд╡рд▓ рддреАрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрдмрдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рдЪреАрд▓рд╛рдкрди (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ) System.Xml.Serialization рдирд╛рдорд╕реНрдерд╛рди рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред
рдпрд╣рд╛рдБ рдпрд╣ рдХреЛрдб рд╣реИ:
 //  XmlSerializer ser = new XmlSerializer(typeof(T)); FileStream stream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write); ser.Serialize(stream, obj); // XmlSerializer ser = new XmlSerializer(typeof(T)); stream = new FileStream(filePath, FileMode.Open, FileAccess.Read); result = (T)ser.Deserialize(stream); 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдирдкреБрдЯ рддрд░реНрдХ рд╣реИрдВ: рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рдЬрд╣рд╛рдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛; рд╡рд╕реНрддреБ рд╣реА; рдФрд░ рдХреНрд░рдордмрджреНрдз рд╡рд╕реНрддреБ рдХрд╛ рдкреНрд░рдХрд╛рд░ред рдпрд╣ рдХреЛрдб рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, CreateFile рд╡рд░реНрдЧ, рдЬрд┐рд╕рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдкрджрд╛рдиреБрдХреНрд░рдо CreateFile <- TransactionalCommand <- рдХрдорд╛рдВрдб рд╣реИ, рддреЛ T = рдХрдорд╛рдВрдб рдкрд░, serializer рд╣рдореЗрдВ XmlInclude рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдЧрд╛, рдЬреЛ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рд╕рднреА рд╕рдВрднрд╡ рдиреЗрд╕реНрдЯреЗрдб рдФрд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрддрд╛рддрд╛ рд╣реИред рдХреНрд░рдордмрджреНрдз рд╡рд╕реНрддреБред рдФрд░ рдпрд╣ рдЗрддрдиреА рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдирд╣реАрдВ рд╣реЛрдЧреА рдЕрдЧрд░ рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХрдорд╛рдВрдб рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ XmlInclude рдЕрдкрдиреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╡рдВрд╢рдЬреЛрдВ рдХреЗ рд▓рд┐рдПред рдФрд░ рдЪреВрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрдорд╛рдВрдб рд╡рд░реНрдЧ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдмрд┐рдирд╛ рдкреНрд▓рдЧ-рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдЖрджреЗрд╢реЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝реЗ рдЧрдП рдЗрди рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╡рд╣рд╛рдБ рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИред рд╕рднреА рд╢рд╛рдорд┐рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рди рдХреЗрд╡рд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ XmlSerializer рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЗ рдкреНрд░рддреНрдпрдХреНрд╖ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде, рдЬрд┐рд╕рдореЗрдВ рджреВрд╕рд░рд╛ рддрд░реНрдХ рдкреНрд░рдХрд╛рд░ [] рд╢рд╛рдорд┐рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рд╕рд░рдгреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
 Type[] types; XmlSerializer ser = new XmlSerializer(typeof(T), types); 

рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣реА рд╣реИ, рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдореЗрдЯрд╛-рдЬрд╛рдирдХрд╛рд░реАред
рдкреНрд▓рдЧрдЗрдиреНрд╕ рдФрд░ рдореЗрдЯрд╛рдбреЗрдЯрд╛
рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП GinMetaData рдХреНрд▓рд╛рд╕ рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛
 public class GinMetaData { public List<ExternalCommand> Commands { get; private set; } public Type[] IncludedTypes { get; private set; } public static GinMetaData GetInstance(); public void Plugin(string folderPath) public ExternalCommand GetCommandByName(string name) } 

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрд╡реЗрджрди рдореЗрдВ рд╣рдореЗрд╢рд╛ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдПрдХрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрдирдЯрд╛рдЗрдкреНрд╕ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рд╡реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ рдЬреЛ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдореБрдЦреНрдп рдЗрдВрд╕реНрдЯреЙрд▓рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдЗрд╕рдХреЗ рдкреНрд▓рдЧ-рдЗрди рджреЛрдиреЛрдВ рд╕реЗ рдкреНрд░рдХрд╛рд░ред рдирдП рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд▓рдЧрдЗрди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рднреА рдиреЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛрдВрдЧреА (рдЬрдм рддрдХ рдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдирдореЗрдВ рдирдИ рдХрдорд╛рдВрдб рдФрд░ рд╕рд╣рд╛рдпрдХ рдХрдХреНрд╖рд╛рдПрдВ рди рд╣реЛрдВ)ред
рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╕рднреА рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдВрдХ GinMetaData.Commands рд▓рд┐рд╕реНрдЯ рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ GinMetaData рд╡рд░реНрдЧ рдореЗрдВ LoadCommandsFrom (рдЕрд╕реЗрдВрдмрд▓реА) рд╡рд┐рдзрд┐ рдмрдирд╛рдИ:
 private void LoadCommandsFrom(Assembly assembly) { foreach (Type type in assembly.GetTypes()) { if (ExternalCommand.ContainsCommand(type)) { ExternalCommand cmd = new ExternalCommand(type); Commands.Add(cmd); _includedTypes.Add(cmd.CommandType); } } } 

рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕ рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдПрдХреНрд╕рдЯрд░реНрдорд╛рдХрдореИрдВрдб рд╡рд░реНрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдпрд╣рд╛рдБ рдЗрд╕рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ:
 public class ExternalCommand { public ExternalCommand(Type type) public Type CommandType { get; private set; } public Command Instance { get; private set; } public PropertyInfo[] Properties { get; private set; } public ConstructorInfo Constructor { get; private set; } public CommandMetadata Metadata { get; private set; } public static bool ContainsCommand(Type type) public object GetProperty(string propertyName) public void SetProperty(string propertyName, object value) public ExternalCommand Clone() } 

рдмрд╛рд╣реНрдпрдХрдорд╛рдВрдб рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдХрдорд╛рдВрдб рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЖрд╕рдкрд╛рд╕ рдПрдХ рдЖрд╡рд░рдг рд╣реИред рдПрдХреНрд╕рдЯрд░реНрдорд╛рдХрдо рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЯрд╛рдЗрдк рдЯрд╛рдЗрдк рдХрд╛ рддрд░реНрдХ рд╣реЛрддрд╛ рд╣реИ - рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдиреЗрдЯ рдЕрд╕реЗрдВрдмрд▓реА рд╕реЗ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдкреНрд▓рдЧ-рдЗрди рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рди рдХреЗрд╡рд▓ рдХрдорд╛рдВрдб рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рднреА рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рд╕реЗ рдХрдорд╛рдВрдб рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд▓реЛрдб рдкреНрд░рдХрд╛рд░ рдПрдХ рдорд╛рдиреНрдп рдХрдорд╛рдВрдб рд╣реИред рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдореЗрдВ ContainsCommand (рдкреНрд░рдХрд╛рд░) рд╕рд┐рд░реНрдл рд╕рднреА рдФрдкрдЪрд╛рд░рд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд▓реЛрдб рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ - рдкреНрд░рдХрд╛рд░ рдХреЛ рдХрдорд╛рдВрдб рд╕реЗ рдпрд╛ рдЗрд╕рдХреЗ рдХрд┐рд╕реА рд╡рдВрд╢рдЬ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рд╛рд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ) рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ GIIgnoreType рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд▓рдЧ-рдЗрди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреЗрд╢ рдХреА, рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд▓рдЧ-рдЗрди рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)ред
рдХрдорд╛рдВрдб рдЯрд╛рдЗрдк рдкреНрд░реЙрдкрд░реНрдЯреА рд▓реЛрдбреЗрдб рдХрдорд╛рдВрдб рдХреЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИ, рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдкреНрд░реЙрдкрд░реНрдЯреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЧрдП рд▓реЛрдб рдХрдорд╛рдВрдб рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИред рдЧреБрдг рдЧреБрдг рдХрдорд╛рдВрдб рдЧреБрдг рдХрд╛ рдПрдХ рд╕рд░рдгреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдХрдорд╛рдВрдб рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрд╛рд╣рд░реА рдХрдорд╛рдВрдб рдореЗрдВ рд╕рднреА рдХрдорд╛рдВрдб рдХреЗ рдореВрд▓ рд╡рд░реНрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХреЗрд╡рд▓ Do () рд╡рд┐рдзрд┐ рд╣реИ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЧреБрдг рд╕реАрдзреЗ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реАрдзреЗ рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рд╕рд░рдгреА PropertyInfoред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рд╕реВрдЪреАрдмрджреНрдз рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧреБрдг рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХреНрд╕рд░реЛрдореЙрдиреНрдб рдХреНрд▓рд╛рд╕ рдореЗрдВ рджреЛ рддрд░реАрдХреЗ рд╣реЛрддреЗ рд╣реИрдВ: рдЧреЗрдЯрдкреНрд░реЙрдкрд░реНрдЯреА (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреБрдВрдЬреА), рдФрд░ рд╕реЗрдЯрдкреНрд░реЙрдкрд░реНрдЯреА (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреБрдВрдЬреА, рдСрдмреНрдЬреЗрдХреНрдЯ рд╡реИрд▓реНрдпреВ)ред
рд▓реЛрдб рдХреА рдЧрдИ рдХрдорд╛рдВрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╕рдВрдкрддреНрддрд┐ рдХреЛрдИ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╣реИред рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдЗрд╕ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рджреГрд╢реНрдп рдкреИрдХреЗрдЬ рдбрд┐рдЬрд╛рдЗрдирд░ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХрдорд╛рдВрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рд╡рд┐рд╖рдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдХрдорд╛рдВрдб рдХреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдореЗрдВ, рдЖрдк рдХрдорд╛рдВрдб рдХреЗ рдРрд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЙрд╕рдХреЗ рдирд╛рдо, рдЙрд╕рдХреЗ рд╡рд┐рд╡рд░рдг, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдкреИрдХреЗрдЬ рдбрд┐рдЬрд╛рдЗрдирд░ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрджрд┐ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд▓рд╣рд╛рд▓, рдЯреАрдо рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ: рдЯреАрдо рдХрд╛ рдирд╛рдо, рдЙрд╕рдХрд╛ рд╡рд┐рд╡рд░рдг рдФрд░ рдЯреАрдореЛрдВ рдХреЗ рд╕рдореВрд╣ рдХрд╛ рдирд╛рдо:
 public class CommandMetadata { public string Name { get; set; } public string Desription { get; set; } public string Group { get; set; } } 

рдЧреНрд░реБрдк рдСрдл рдХрдорд╛рдВрдб, рдпрд╣ рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ - рдкреИрдХреЗрдЬ рдбрд┐рдЬрд╛рдЗрдирд░ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдХрдорд╛рдВрдб рдХреЗ рдЧреНрд░реБрдкрд┐рдВрдЧ рдиреЛрдб рдХрд╛ рдирд╛рдоред рдпрд╣ рд╕рдореВрд╣реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реВрдЪреА рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЖрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд░рдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдлрд╝рд╛рдЗрд▓ рд╕рдВрдЪрд╛рд▓рди, IIS рдкреНрд░рдмрдВрдзрди, SQL рдЖрджреЗрд╢, рд╕рдВрд░рдЪрдирд╛ рдЖрджреЗрд╢ред рдФрд░ рдЕрдиреНрдп рд╕рдореВрд╣ред
рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреАрдо рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдЕрдм рддрдХ, рдореЗрд░реЗ рдкрд╛рд╕ GinNameAttribute рдХрдорд╛рдВрдб рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдЧреБрдг рд╣реИ, рдпрд╣рд╛рдБ рдЗрд╕рдХрд╛ рд╡рд┐рд╡рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)] public class GinNameAttribute : Attribute { public string Name { get; set; } public string Description { get; set; } public string Group { get; set; } } 

рдЗрд╕реЗ рдХрдорд╛рдВрдб рдХреНрд▓рд╛рд╕ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣:
 [GinName( Name = "-", Description = "  if-then-else", Group = " ")] public class ExecuteIf : TransactionalCommand, IContainerCommand { // тАжтАж } 

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

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


All Articles