MKOl dla maszynopis

głosy
8

Z maszynopis teraz mamy statyczne analizować i wiele funkcji OOP w JavaScript. Więc jest to również czas, aby mieć lepsze testy jednostkowe logiki po stronie klienta, jak i również musimy kontenera IOC dla wstrzykiwanie zależności, aby kod bardziej sprawdzalne ...

Tak, że ktoś już doświadczenie to ten temat lub może wiedzieć bibliotek dla maszynopisu lub ram JavaScript, które mogą być Porting do maszynopis?

Utwórz 09/10/2012 o 09:15
źródło użytkownik
W innych językach...                            


6 odpowiedzi

głosy
15

I opracowali kontenera IoC nazwie InversifyJS z zaawansowanych funkcji, takich jak zależność wtrysku wiązań kontekstowych.

Trzeba wykonać 3 podstawowe kroki , aby go używać:

1. Dodawanie adnotacji

Adnotacja API jest oparty na Kątowymi 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. Zadeklaruj Wiązania

API wiążący oparty jest na 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. rozwiązać problemów z zależnościami

Uchwała API jest oparty na Ninject:

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

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

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

W najnowszej wersji (2.0.0) obsługuje wiele przypadków użycia:

  • moduły jądra
  • kernel middleware
  • Użyj klasy, literały ciągów znaków lub symboli jako identyfikatory zależność
  • Wstrzyknięcie wartości stałych
  • Wstrzyknięcie konstruktorów klasy
  • Wstrzyknięcie fabryk
  • fabryka auto
  • Wstrzyknięcie dostawców (fabryka asynchroniczny)
  • Wózki aktywacji (do wtryskiwania proxy)
  • Wielu zastrzyki
  • Tagged wiązania
  • dekoratorzy tag zwyczaj
  • nazwane wiązania
  • wiązania kontekstowe
  • Friendly wyjątkami (np zależności cyrkulacyjne)

Możesz dowiedzieć się więcej na ten temat na https://github.com/inversify/InversifyJS

Odpowiedział 07/05/2015 o 22:33
źródło użytkownik

głosy
3

Stworzyłem biblioteki DI dla maszynopisu - huject

https://github.com/asvetliakov/huject

Przykład:

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

Jest problem z interfejsami maszynopis chociaż, ale mam 2 obejścia (użyj abstrakcyjne lub prostą klasę jako interfejs)

Odpowiedział 31/08/2015 o 00:13
źródło użytkownik

głosy
3

Na razie, można użyć Dependency Injection w JavaScript bez części MKOl. To do Ciebie, czy piszesz „Manual” rozpoznawania nazw lub fabryki, czy cokolwiek DI wzór wolisz.

Gdy średnia ECMAScript 6 zostanie przyjęta, może sprawić, że pojęcie MKOl możliwe JavaScript.

Odpowiedział 09/10/2012 o 11:28
źródło użytkownik

głosy
2

Byliśmy przy użyciu prostego kontener wstrzykiwania zależności, który wykorzystuje AMD zdefiniować / wymagać - jak składni. Oryginalny realizacja jest w maszynopisie, chociaż blogu poniżej przedstawia je w zwykły stary JavaScript.

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

Jest to dość proste do zdefiniowania relacji z zależnościami bez konieczności kilka konfiguracji i obsługuje rozdzielczość kołową zależność podobną do requirejs.

Oto prosty przykład:

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

});
Odpowiedział 12/11/2012 o 07:41
źródło użytkownik

głosy
1

Alternatywnie można użyć nie tylko ramy i użyć klasy jako pojemnik z fabryk obiektów jak właściwości. Następnie można odziedziczyć tę klasę w testach i fabryk zmiana. Takie podejście jest typu bezpieczne i nie wymaga żadnych dekoratorów, tylko rejestrację klas.

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;
Odpowiedział 15/10/2015 o 08:35
źródło użytkownik

głosy
0

Zamówienie https://github.com/typestack/typedi

coś takiego jest możliwe:

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

@Service()
class SomeClass {

    someMethod() {
    }

}

let someClass = Container.get(SomeClass);
someClass.someMethod();
Odpowiedział 03/12/2018 o 12:15
źródło użytkownik

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