рдкрд╣рд▓рд╛ DI: рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ рдкрд╣рд▓рд╛ DI

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

DI рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣реИ?


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

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

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

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рддреИрдпрд╛рд░ рдХрд░реЗрдВред

рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░реА


рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ 3 рд╕рд░рд▓ рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  1. рдкрд░рд╛рд╡рд░реНрддрдХ -рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ ред
  2. Tsconfig рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, emitDecoratorMetadata рдФрд░ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХDecorators рд╡рд┐рдХрд▓реНрдк рд╕рдХреНрд╖рдо рдХрд░реЗрдВред рдкрд╣рд▓рд╛ рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рджреВрд╕рд░реЗ рдореЗрдВ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╢рд╛рдорд┐рд▓ рд╣реИ
  3. рдХрд┐рд╕реА рднреА рдЦрд╛рд▓реА рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрд╕реНрдЯ рдкреНрд░рддрд┐рдмрд┐рдВрдм = (...__ рдкрд░рдо: рдСрдмреНрдЬреЗрдХреНрдЯ []): рд╢реВрдиреНрдп => {} рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдЕрдм рдореИрдВ рдЗрд╕рдХреЗ рд╕рд░рд▓рддрдо рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реВрдВрдЧрд╛ред

рд╕рд░рд▓ рдЙрдкрдпреЛрдЧ


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢реБрджреНрдз рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓реЗрдВ:

import { autowired, override, reflection } from "first-di";

@reflection // typescript  
class ProdRepository { //   

    public async getData(): Promise<string> {
        return await Promise.resolve("production");
    }

}

@reflection
class MockRepository { //       

    public async getData(): Promise<string> {
        return await Promise.resolve("mock");
    }

}

@reflection
class ProdService {

    constructor(private readonly prodRepository: ProdRepository) { }

    public async getData(): Promise<string> {
        return await this.prodRepository.getData();
    }

}

class ProdController { //   React, Preact, Mithril  .

    @autowired() //  
    private readonly prodService!: ProdService;

    // constructor  ,   React, Preact, Mithril
    //      

    public async getData(): Promise<string> {
        return await this.prodService.getData();
    }

}

if (process.env.NODE_ENV === "test") { //    
    override(ProdRepository, MockRepository);
}

const controllerInstance = new ProdController(); //   
const data = await controllerInstance.getData();

if (process.env.NODE_ENV === "test") {
    assert.strictEqual(data, "mock"); //  
} else {
    assert.strictEqual(data, "production"); //  
}

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

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

рдЖрдк рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:

//  1 
import { DI, AutowiredLifetimes } from "first-di";
DI.defaultOptions.lifeTime = AutowiredLifetimes.PER_INSTANCE;

//  2  
import { autowired, AutowiredLifetimes } from "first-di";
@autowired({lifeTime: AutowiredLifetimes.PER_INSTANCE})
private readonly prodService!: ProdService;

//  3  
import { override, AutowiredLifetimes } from "first-di";
override(ProdRepository, MockRepository, {lifeTime: AutowiredLifetimes.PER_INSTANCE});

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

рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдЙрдкрдпреЛрдЧ


рдкреЗрд╢реЗрд╡рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдмрджрд▓рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХ рд╕рд░рд▓ рдЙрдкрд╛рдп рд╣реИ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдпрд╛рдж рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ ... рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╣реИ!

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд░рдирдЯрд╛рдЗрдо рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдореВрд░реНрдд рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

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

import { autowired, override, reflection } from "first-di";

abstract class AbstractRepository { //    

    abstract getData(): Promise<string>;

}

@reflection
class ProdRepository implements AbstractRepository {

    public async getData(): Promise<string> {
        return await Promise.resolve("production");
    }

}

@reflection
class MockRepository implements AbstractRepository {

    public async getData(): Promise<string> {
        return await Promise.resolve("mock");
    }

}

abstract class AbstractService { //    

    abstract getData(): Promise<string>;

}

@reflection
class ProdService implements AbstractService {

    private readonly prodRepository: AbstractRepository;

    constructor(prodRepository: AbstractRepository) {
        this.prodRepository = prodRepository;
    }

    public async getData(): Promise<string> {
        return await this.prodRepository.getData();
    }

}

class ProdController { //   React, Preact, Mithril  .

    @autowired()
    private readonly prodService!: AbstractService;

    // constructor  ,   React, Preact, Mithril
    //      

    public async getData(): Promise<string> {
        return await this.prodService.getData();
    }

}

override(AbstractService, ProdService);

if (process.env.NODE_ENV === "test") {
    override(AbstractRepository, MockRepository);
} else {
    override(AbstractRepository, ProdRepository);
}

const controllerInstance = new ProdController();
const data = await controllerInstance.getData();

if (process.env.NODE_ENV === "test") {
    assert.strictEqual(data, "mock");
} else {
    assert.strictEqual(data, "production");
}

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

рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ DI рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИред рдФрд░ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ C # рдФрд░ Java рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ, рд╡реЗ рд╡реЗрдм рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдореЗрдВ рдореМрдЬреВрджрд╛ рдЕрдиреБрднрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкрд╛рдПрдВрдЧреЗред

рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдУрдВ


DI рдХреА рдХрдИ рдкреНрд░рддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

import { DI } from "first-di";
import { ProductionService } from "../services/ProductionService";

const scopeA = new DI();
const scopeB = new DI();

export class Controller {

    @scopeA.autowired()
    private readonly serviceScopeA!: ProductionService;

    @scopeB.autowired()
    private readonly serviceScopeB!: ProductionService;

    // constructor  ,   React, Preact, Mithril
    //      

    public async getDataScopeA(): Promise<string> {
        return await this.serviceScopeA.getData();
    }

    public async getDataScopeB(): Promise<string> {
        return await this.serviceScopeB.getData();
    }

}

рд╡рд┐рд╕реНрддрд╛рд░, рдЖрдк рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ DI рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

import { DI } from "first-di";

class MyDI extends DI {
    // extended method
    public getAllSingletons(): IterableIterator<object> {
        return this.singletonsList.values();
    }
}

рдФрд░ рдХрдИ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЧрд┐рдЯрд╣рдм рдкрд░ рднрдВрдбрд╛рд░ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

рдЖрдкрдХрд╛ рдЦреБрдж рдХрд╛ рд▓рд┐рдЦрд╛ рдФрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛?


рдХрд╛рд░рдг рд╕рд░рд▓ рд╣реИ - рдЬрдм рдпрд╣ DI рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рддреЛ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдерд╛ред рдпрд╣ рдПрдХ рд╕рдордп рдерд╛ рдЬрдм рдХреЛрдгреАрдп 1 рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рдерд╛, рдФрд░ рдХреЛрдгреАрдп 2 рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рдерд╛ред рдХрдХреНрд╖рд╛рдПрдВ рд╕рд┐рд░реНрдл рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ, рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдмред рд╕рдВрдпреЛрдЧ рд╕реЗ, рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдкреНрд░реЗрд░рдгрд╛ рдмрди рдЧрдИ рд╣реИред

InversifyJS - рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рд░реВрдк рдореЗрдВ рднреА рдореБрдЭреЗ рд╢реЛрднрд╛ рдирд╣реАрдВ рджреЗрддрд╛ред рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреВрд╕рд░реА рддрд░рдл рд▓рд╛рдЗрди рдпрд╛ рдЪрд░рд┐рддреНрд░ рджреНрд╡рд╛рд░рд╛ рдкрдВрдЬреАрдХрд░рдг рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рднрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдорд╛рд░рддрд╛ рд╣реИред

рдкрд╕рдВрдж рдХрд┐рдпрд╛?


рдпрджрд┐ рдЖрдкрдХреЛ рдпрд╣ DI рдкрд╕рдВрдж рдЖрдпрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВред рдЗрд╕рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ, рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ, рд╕рд┐рддрд╛рд░реЗ рд▓рдЧрд╛рдПрдВред рдЧрд┐рдЯрд╣рдм рднрдВрдбрд╛рд░ ред

All Articles