NOB a géppel

szavazat
8

A géppel most már a statikus elemzésére és sok OOP funkciók JavaScript. Tehát ez is az ideje, hogy jobb egység vizsgálatok kliens oldali logikát, és csakúgy, szükségünk van a NOB konténer függőség injekciók, hogy a kód is tesztelhető, ...

Szóval, valaki már tapasztalt meg ebben a témakörben, vagy talán tudja, könyvtárak géppel vagy JavaScript keretrendszerek, hogy lehet átültetni a géppel?

A kérdést 09/10/2012 09:15
a forrás felhasználó
Más nyelveken...                            


6 válasz

szavazat
15

Kidolgoztam egy NOB konténer nevű InversifyJS előrehaladott függőség injekció funkciók, mint a kontextus kötések.

Meg kell, hogy kövesse 3 alaplépéseket kell használni:

1. Add kommentárok

A kommentár API alapul szögletes 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. állapítsa kötések

A kötési API alapul 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. függőségek feloldása

A felbontás API alapul Ninject:

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

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

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

A legújabb kiadás (2.0.0) támogatja számos felhasználásához:

  • kernel modulok
  • kernel middleware
  • Használja osztályok, string literálok vagy szimbólumok, mint függőség azonosítók
  • Injekció konstans értékek
  • Injekció osztály konstruktőrök
  • Injekciós gyárak
  • Auto gyár
  • Injekciós szolgáltatók (aszinkron gyári)
  • Aktiválás rakodók (befecskendezésére használt proxyk)
  • Multi injekciók
  • Tagged kötések
  • Egyedi címke dekoráció
  • Nevezett kötések
  • A kontextus kötések
  • Barátságos kivétel (pl Kör függőségek)

Akkor többet róla https://github.com/inversify/InversifyJS

Válaszolt 07/05/2015 22:33
a forrás felhasználó

szavazat
3

Létrehoztam DI könyvtár géppel - huject

https://github.com/asvetliakov/huject

Példa:

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);

Van egy probléma a géppel felületek ugyan, de nekem van 2 megoldásai (használjon absztrakt vagy egyszerű osztály interface)

Válaszolt 31/08/2015 00:13
a forrás felhasználó

szavazat
3

Most, akkor függőség injekció JavaScript nélkül a NOB részéről. Ez rajtad múlik, hogy írsz egy „kézi” névfeloldóként vagy gyárak, vagy bármi DI mintát szeretne.

Amikor az ECMAScript 6 szabvány elfogadásra kerül, akkor lehet, hogy a fogalom a NOB lehetséges JavaScript.

Válaszolt 09/10/2012 11:28
a forrás felhasználó

szavazat
2

Már egy egyszerű függőség injekció tartály, amely felhasználja az AMD meghatározzák / igényel - mint a szintaxis. Az eredeti végrehajtás géppel, de a blogbejegyzést bemutat azt öreg JavaScript.

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

Elég egyértelmű, hogy meghatározza függőségi viszonyok nélkül egy csomó konfiguráció, és támogatja a körkörös függőség hasonló requirejs.

Itt egy egyszerű példa:

// 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

});
Válaszolt 12/11/2012 07:41
a forrás felhasználó

szavazat
1

Alternatívaként lehet csak használni nem keret, és használja osztály konténer objektum gyárak tulajdonságait. Ezután öröklik ezt az osztályt tesztek és változás gyárak. Ez a megközelítés írja biztonságosak, és nem igényel semmilyen festő, csak regisztrációs osztályok.

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;
Válaszolt 15/10/2015 08:35
a forrás felhasználó

szavazat
0

Fizetéskor https://github.com/typestack/typedi

valami ilyesmi lehet:

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

@Service()
class SomeClass {

    someMethod() {
    }

}

let someClass = Container.get(SomeClass);
someClass.someMethod();
Válaszolt 03/12/2018 12:15
a forrás felhasználó

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