IOC voor typoscript

stemmen
8

Met Typescript nu hebben we statische analyseren en vele OOP functies in JavaScript. Dus het is ook tijd om beter te unit tests in client-side logica en zo goed we IOC container voor dependency injection moeten code meer toetsbaar te maken ...

Dus, hebben er al iemand ervaren dit onderwerp of misschien weet bibliotheken voor de schrijfmachine of JavaScript-frameworks die kunnen worden porten naar typoscript?

De vraag is gesteld op 09/10/2012 om 09:15
bron van user
In andere talen...                            


6 antwoorden

stemmen
15

Ik heb een IoC container genaamd InversifyJS met geavanceerde dependency injection functies, zoals contextuele bindingen ontwikkeld.

U moet volgen 3 eenvoudige stappen om het te gebruiken:

1. Voeg annotaties

De annotatie API is gebaseerd op Angular 2.0:

import { injectable, inject } from "inversify";

@injectable()
class Katana implements IKatana {
    public hit() {
        return "cut!";
    }
}

@injectable()
class Shuriken implements IShuriken {
    public throw() {
        return "hit!";
    }
}

@injectable()
class Ninja implements INinja {

    private _katana: IKatana;
    private _shuriken: IShuriken;

    public constructor(
        @inject("IKatana") katana: IKatana,
        @inject("IShuriken") shuriken: IShuriken
    ) {
        this._katana = katana;
        this._shuriken = shuriken;
    }

    public fight() { return this._katana.hit(); };
    public sneak() { return this._shuriken.throw(); };

}

2. Verklaren bindingen

De binding API is gebaseerd op Ninject:

import { Kernel } from "inversify";

import { Ninja } from "./entities/ninja";
import { Katana } from "./entities/katana";
import { Shuriken} from "./entities/shuriken";

var kernel = new Kernel();
kernel.bind<INinja>("INinja").to(Ninja);
kernel.bind<IKatana>("IKatana").to(Katana);
kernel.bind<IShuriken>("IShuriken").to(Shuriken);

export default kernel;

3. Resolve afhankelijkheden

De resolutie API is gebaseerd op Ninject:

import kernel = from "./inversify.config";

var ninja = kernel.get<INinja>("INinja");

expect(ninja.fight()).eql("cut!"); // true
expect(ninja.sneak()).eql("hit!"); // true

De nieuwste versie (2.0.0) ondersteunt een groot aantal use cases:

  • kernelmodules
  • kernel middleware
  • Gebruik klassen, letterlijke tekenreeksen of symbolen als afhankelijkheid identifiers
  • Injectie van constante waarden
  • Injectie van klasse constructeurs
  • Injectie van fabrieken
  • autofabriek
  • Injectie van aanbieders (asynchroon fabriek)
  • Activatie handlers (vroeger proxies injecteren)
  • Multi-injecties
  • tagged bindingen
  • Custom tag decorateurs
  • Genoemd bindingen
  • contextuele bindingen
  • Vriendelijke uitzonderingen (bv Circular afhankelijkheden)

U kunt er meer over te leren op https://github.com/inversify/InversifyJS

antwoordde op 07/05/2015 om 22:33
bron van user

stemmen
3

Ik heb DI bibliotheek gemaakt voor typoscript - huject

https://github.com/asvetliakov/huject

Voorbeeld:

import {Container, FactoryMethod, ConstructorInject, Inject} from 'huject';
class FirstService {
   public constructor(param: number) {}
}
class SecondService {
}

@ConstructorInject
class MyController {
    @Inject
    public service: FirstService;

    public second: SecondService;
    public constructor(service: SecondService) {
        this.second = service;
    }
    ...
}
container.setAllowUnregisteredResolving(true);
container.register(FirstService, [10]); // Register constructor arguments

// FirstService and SecondService will be resolved for container instance
let controller = container.resolve(MyController);

Er is een probleem met typoscript interfaces wel, maar ik heb 2 oplossingen (gebruik abstract of eenvoudige klasse als interface)

antwoordde op 31/08/2015 om 00:13
bron van user

stemmen
3

Voor nu kun je dependency injection in JavaScript gebruiken zonder het IOC deel. Het is aan u of u een "manual" resolver, of fabrieken, of wat dan ook DI patroon dat u liever schrijven.

Wanneer de ECMAScript 6 standaard is goedgekeurd, kan het concept van het IOC mogelijk in JavaScript maken.

antwoordde op 09/10/2012 om 11:28
bron van user

stemmen
2

We gebruiken een eenvoudige dependency injection container die gebruik maakt van AMD definiëren / vereisen - achtige syntax. De oorspronkelijke implementatie is in typoscript, hoewel de blog post hieronder presenteert op gewone oude JavaScript.

http://blog.coolmuse.com/2012/11/11/a-simple-javascript-dependency-injection-container/

Het is vrij eenvoudig om afhankelijkheidsrelaties bepalen zonder dat een stel configuratie en ondersteunt kringafhankelijkheid resolutie Soortgelijke requirejs.

Hier is een eenvoudig voorbeeld:

// create the kernel
var kernel = new ServiceKernel();

// define service1
kernel.define("service1", function() {

    // service1 has a function named foo
    return {
        foo: function () { return "foo"; }
    }

});

// define service2, which depends on service1
kernel.define("service2", ["service1"], function(service1) {

    // service2 has a function named foobar
    return {
        foobar : function() { return service1.foo() + "bar"; }
    }

});

// get service2 instance 
var service2 = kernel.require("service2");
service2.foobar();  // returns "foobar"

// get both service1 and service2 instances
kernel.require(["service1", "service2"], function(service1, service2) {

    alert(service1.foo() + service2.foobar()); // displays foofoobar

});
antwoordde op 12/11/2012 om 07:41
bron van user

stemmen
1

Als alternatief kunt u gewoon gebruik maken van geen kader en het gebruik van klasse als container met object fabrieken als eigenschappen. U kunt dan erven deze klasse in tests en verandering fabrieken. Deze aanpak is type veilig en geen decorateurs, maar registratie van klassen niet nodig.

class B {
    echo() {
        alert('test');
    }   
}

class A {
    constructor(private b: B) {
        b.echo();
    }
}

class Container {
    A = () => new A(this.B());
    B = singleton(() => new B()); 
}

var c = new Container();
var a = c.A();

// singleton helper:

function memoize<T>(factory: () => T): () => T  {
    var memo: T = null;
    return function () {
        if(!memo) {
            memo = factory();
        }
        return memo;
    };
}

var singleton = memoize;
antwoordde op 15/10/2015 om 08:35
bron van user

stemmen
0

checkout https://github.com/typestack/typedi

zoiets als dit mogelijk is:

import "reflect-metadata";
import {Service, Container} from "typedi";

@Service()
class SomeClass {

    someMethod() {
    }

}

let someClass = Container.get(SomeClass);
someClass.someMethod();
antwoordde op 03/12/2018 om 12:15
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more