C ++ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди

MagicClass::getInstance().getFooFactory().createFoo().killMePlease();
      
      





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



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


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



рдкрд░реАрдХреНрд╖рдг ред рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рд▓рдХреНрд╖реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХред рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдореБрдЦреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрд░реАрдХреНрд╖рдг рд╕реНрдЯрдмреНрд╕ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред



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



рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕рдВрд╕реНрдХрд░рдг рдпрд╣рд╛рдВ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред



рдЪрд▓реЛ рд╡реНрдпрд╛рдкрд╛рд░ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЛред рдЬреАрд╡рди рдХреЗ рд╕рдордп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред



  1. рдПрдХрд▓ (рд╕рд┐рдВрдЧрд▓рдЯрди)ред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреВрд░реЗ рдЬреАрд╡рди рдореЗрдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдерд┐рд░ рдЙрджрд╛рд╣рд░рдг рд╣реИред
  2. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд╕реНрддреБ ( рд╕рд╛рдЭрд╛ )ред рдПрдХ рдХреБрдВрд╡рд╛рд░реЗ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБ рдореМрдЬреВрдж рд╣реИ рдЬрдмрдХрд┐ рдХреЛрдИ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╕рднреА рдЧреНрд░рд╛рд╣рдХ рдЙрд╕реА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдХрдИ рдмрд╛рд░ рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди рдмрдирд╛рдпрд╛ рдФрд░ рдирд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдмрд╛рд░ рднреА рдирд╣реАрдВ, рдЕрдЧрд░ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рд╡рд╛рд▓реЗ рд▓реЛрдЧ рдирд╣реАрдВ рдереЗред
  3. рдСрдмреНрдЬреЗрдХреНрдЯ (рд╡рд╕реНрддреБ)ред рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
  4. рд░рдирдЯрд╛рдЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдХ рд╣реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред




рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдпрд╣ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдореНрдмреЗрдбреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред

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



 class SomeClass { public: private: inject(SomeInterface, mFieldName) };
      
      







рдореБрдЭреЗ рддреБрд░рдВрдд рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╢реБрд░реВ рдореЗрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореЗрд░реЗ рд╕рдкрдиреЛрдВ рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдереЗ, рд▓реЗрдХрд┐рди рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдФрд░ рдкрд╛рд░рджрд░реНрд╢реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рд╛ред рд▓реЗрдХрд┐рди рд╕рд╛рдВрд╕рд╛рд░рд┐рдХ рдореИрдХреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдпрд╣ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ред



рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдЬрдЧрд╣ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдирд┐рд░реНрднрд░рддрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ рд╣реЛред



 inject_as_share(Interface1, Class1) inject_as_singleton(Interface2, Class1) inject_as_object(Interface3, Class1) inject_as_runtime(Interface4)
      
      







рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рджреВрд╕рд░рд╛ рд╡рд╣ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдПрдХ рд╡рд░реНрдЧ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд░рдирдЯрд╛рдЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдХрд╣реАрдВ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (рд╕рдмрд╕реЗ рд╕рдлрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рднреА рд╣реЛрддреА рд╣реИ)



 inject_set_runtime(Interface4, &implementation4)
      
      







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



 inject_as_share(Interface1, Class1, "param1", 1234, true)
      
      







рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рджреЗрд░реА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдУ 2 рдкрд░ рд╡рд╕реНрддреБ рдУ 1 рдХреА рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдкрд░ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред



  1. o1 рд╕реАрдзреЗ рдПрдХ o2 рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ "рд▓рд▓рд╛рдЯ" рдФрд░ рдЕрдирдореНрдп рд╡рд┐рдзрд┐, рдУ 2 рдХреА рдЬрдЧрд╣ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдХреЛ рдлрд╛рд╡рдбрд╝рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдПрдХ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдЪреВрдВрдХрд┐ рдУ 1 рдиреЗ рдУ 2 рдмрдирд╛рдпрд╛, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рд╡рд╣ рд╣реИ рдЬреЛ рд╡рд┐рдирд╛рд╢ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд▓реЗрддрд╛ рд╣реИред
  2. O2 рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ред рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рд╣реИ, рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрд▓рд╛рд╕ рдХреА рдХрдИ рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ / рдпрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реЛрдиреЗ рдкрд░, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  3. рдлреИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐ / рд╡рд░реНрдЧред рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рдУ 2 рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдкреЗрдЪреАрджрдЧрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЦреБрдж рдХрд╛рд░рдЦрд╛рдиреЛрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдм рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕реЗ рд╣реИрдВ) рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╢реЛрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХрд╛ рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред


рд╡рд┐рдиреНрдпрд╛рд╕рдХ


рдЖрдЗрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВред рдЖрдЗрдП рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ рд╣реИрдВ рдХреБрдВрд╡рд╛рд░реЗ рд▓реЛрдЧреЛрдВ рд╕реЗред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП, рд╕рдВрдкреВрд░реНрдг рд╕реЗрдЯрд┐рдВрдЧ рд▓рд╛рдЗрди рдореЗрдВ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧреА



 inject_as_singleton(Interface, Class, [constructor_parameters_list])
      
      







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



 struct Factory { Interface& get(); };
      
      







рдПрдХрд▓ рд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреНрд▓рд╛рд╕рд┐рдХ рд╣реЛрдЧрд╛



 Interface& getInstance() { static T instance = T(...); return instance; }
      
      







рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдХреЙрд▓ рдХреЛ рдХреБрдЫ рдЕрд╕рд╛рдорд╛рдиреНрдп (рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП) рдлрд╝реЙрд░реНрдо рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдХрд▓реНрдк



 static T instance(...);
      
      





рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред



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



 #define inject_as_singleton(Interface, T, ...) \ namespace injector##Interface{ \ Interface& getInstance() \ { \ static T instance = T(__VA_ARGS__); \ return instance; \ } \ struct Factory \ { \ Interface& get() { return getInstance(); } \ }; \ }
      
      







рдореИрдВрдиреЗ рдЖрдЧреЗ рдХрджрдо-рджрд░-рдЪрд░рдг рдкреЗрдВрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рд╣реИ - рдЬреАрд╡рдирдХрд╛рд▓ + рдирд┐рд╢реНрдЪрд┐рдд рдлрд╝реИрдХреНрдЯрд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП "рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ" рд░рдгрдиреАрддрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдПрдХ рдЕрд▓рдЧ рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рдпрд╣ рд╕рдмред



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



 #define inject_as_share(Interface, T, ...) \ namespace injector##Interface{ \ struct Factory \ { \ Factory() { \ if (refCount == 0) { \ object = new T(__VA_ARGS__); \ } \ ++refCount; \ } \ ~Factory() { \ if (--refCount == 0) { \ delete object; \ } \ } \ Interface& get() { return *object; } \ static T* object; \ static unsigned int refCount; \ }; \ T* Factory::object = 0; \ unsigned int Factory::refCount = 0; \ }
      
      







рдХреЛрдб рдХреЛ рд╡рд┐рд╢реЗрд╖ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рд╣рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдХрдо рдХрд░реЗрдВ рдФрд░ рдпрджрд┐ рдПрдХ рдШрдВрдЯреЗ рдмреАрдд рдЪреБрдХрд╛ рд╣реИ, рддреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд╕реНрддреБ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред



рдПрдХ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ "рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рдХреА рд╡рд╕реНрддреБ" рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



 #define inject_as_object(Interface, T, ...) \ namespace injector##Interface{ \ struct Factory \ { \ Factory() : object(__VA_ARGS__) {} \ Interface& get() { return object; } \ T object; \ }; \ }
      
      







рдлреИрдХреНрдЯреНрд░реА рдХреЗ рдкрд╛рд╕ рдРрд╕реА рдХреЛрдИ рд╡рд╕реНрддреБ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрдХреНрдЬреАрдХреНрдпреВрд╢рди рдХреЗ рджреМрд░рд╛рди рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдпрд╣ рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред



 #define inject_as_runtime(Interface) \ namespace injector##Interface{ \ struct Factory \ { \ Interface& get() { return *object; } \ static Interface* object; \ }; \ Interface* Factory::object = 0; \ }
      
      







рд░рдгрдиреАрддрд┐ рдХреЗ рдЕрдВрддрд┐рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдореИрдХреНрд░реЛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА



 #define inject_set_runtime(Interface, Value) injector##Interface::Factory::object = (Value);
      
      





рдХреА рд╢реБрд░реВрдЖрдд


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



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



рддреЛ, рдореИрдХреНрд░реЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрдкрддреНрддрд┐ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА

 #define inject(Interface, Name) \ struct Interface##Proxy \ { \ Interface* operator->() \ { \ return &factory.get(); \ } \ injector##Interface::Factory factory; \ }; \ Interface##Proxy Name;
      
      







рдмрд╕ рдПрдХ рдЖрд╡рд░рдг рд╡рд░реНрдЧ рдЬреЛ рд╡рд╛рдВрдЫрд┐рдд рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ рдФрд░ рдЗрд╕реЗ рдСрдкрд░реЗрдЯрд░ -> рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИ



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


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рднреА рдЖрд╕рд╛рди рд╣реИред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдиреЗ рджреЛ



 class IWork { public: virtual void doSmth() = 0; virtual ~IWork() {}; };
      
      







рдФрд░ рдХрдИ рдХрдХреНрд╖рд╛рдПрдВ рд╡рд░реНрдХ 1, рд╡рд░реНрдХ 2, рдЖрджрд┐, рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реБрдП, рдЗрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЗ рдкрд╛рд╕ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкреВрд░реНрдг рдкрд╛рда рдпрд╣рд╛рдВ рд╣реИрдВ )ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ



 inject_as_share(IWork, Work1) inject_as_singleton(Work2, Work2, 1) inject_as_object(Work3, Work3, 1, true) inject_as_runtime(Work4)
      
      







рдлрд┐рд░ рд╣рдо рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ



 class Employee { public: void doIt() { mWork1->doSmth(); mWork2->doSmth(); mWork3->doSmth(); mWork4->doSmth(); } private: inject(IWork, mWork1) inject(Work2, mWork2) inject(Work3, mWork3) inject(Work4, mWork4) };
      
      







рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ



 Work4 w4; inject_set_runtime(Work4, &w4) Employee e1; e1.doIt();
      
      







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



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



All Articles