MOV pro strojopis

hlasů
8

S psacím stroji nyní máme statické analýzy a mnoho Rysy OOP v JavaScriptu. Tak je to také čas na lepší unit testy na straně klienta logice a stejně musíme MOV kontejner pro závislost injekce, aby kód více testovatelné ...

Takže jste už někdo zkušený, že toto téma, nebo možná víte, knihovny pro psacím stroji nebo rámce JavaScriptu, které lze portování na psacím stroji?

Položena 09/10/2012 v 09:15
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
15

I vyvinuli nádobu IOC volal InversifyJS s pokročilými funkcemi, jako je vkládání závislostí kontextových vazeb.

Budete muset následovat 3 základní kroky k použití:

1. Přidejte anotace

Anotace API je založena na úhlové 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. deklarovat vázání

Vazba API je založena 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. řešení závislostí

Rozlišení API je založena 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

Nejnovější verzi (2.0.0) podporuje mnoho případů použití:

  • jaderných modulů
  • kernel middleware
  • Používat třídy, řetězcové literály nebo symboly jako identifikátory závislost
  • Injekce konstantních hodnot
  • Injekce třídy konstruktérů
  • Injekce továren
  • Auto továrna
  • Injekce poskytovatelů (asynchronní z výroby)
  • Aktivační manipulátory (používá se pro vstřikování proxy)
  • multi injekce
  • označených vázání
  • Custom tag decorators
  • pojmenované vazby
  • Kontextové vazby
  • Přátelské na výjimky (např Cyklické závislosti)

Můžete se dozvědět více o tom na https://github.com/inversify/InversifyJS

Odpovězeno 07/05/2015 v 22:33
zdroj uživatelem

hlasů
3

Vytvořil jsem DI knihovnu strojopisu - huject

https://github.com/asvetliakov/huject

Příklad:

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

To je problém s rozhraním strojopisu i když, ale mám 2 zástupná (používat abstraktní nebo jednoduchou třídu jako rozhraní)

Odpovězeno 31/08/2015 v 00:13
zdroj uživatelem

hlasů
3

Pro tuto chvíli, můžete použít závislost injekce v JavaScriptu bez MOV části. Je jen na vás, zda napsat „manuální“ resolver, nebo továrny, nebo co DI vzor dáváte přednost.

Je-li přijat standard ECMAScript 6, může to dělat pojetí MOV možné v JavaScriptu.

Odpovězeno 09/10/2012 v 11:28
zdroj uživatelem

hlasů
2

Byli jsme pomocí jednoduchého závislost injekce kontejner, který využívá AMD definovat / vyžadují - jako syntax. Původní implementace je na psacím stroji, přestože blogu níže jej prezentuje v obyčejné JavaScriptu.

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

Je to docela jednoduché určit závislost vztahy aniž by to vyžadovalo spoustu konfiguraci a podporuje kruhovou řešení závislostí podobný requirejs.

Zde je jednoduchý příklad:

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

});
Odpovězeno 12/11/2012 v 07:41
zdroj uživatelem

hlasů
1

Případně stačí použít žádný rámec a používat třídu jako kontejner s objektově továren jako vlastnosti. Potom můžete zdědit této třídě v testech a změny továren. Tento přístup je typově bezpečné a nevyžadují žádné malíři, jen registraci tříd.

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;
Odpovězeno 15/10/2015 v 08:35
zdroj uživatelem

hlasů
0

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

něco takového je možné:

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

@Service()
class SomeClass {

    someMethod() {
    }

}

let someClass = Container.get(SomeClass);
someClass.someMethod();
Odpovězeno 03/12/2018 v 12:15
zdroj uživatelem

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