IOC for Loggfila

stemmer
9

Med Loggfila nå har vi statiske analyser og mange OOP funksjoner i Javascript. Så det er også tid til å ha bedre enhet tester i klientsiden logikk og i tillegg må vi IOC container for avhengighet injeksjoner for å gjøre koden mer testbar ...

Så har noen allerede opplevd det dette emnet eller kanskje vet biblioteker for typescript eller Javascript-rammeverk som kan porting til Loggfila?

Publisert på 09/10/2012 klokken 08:15
kilden bruker
På andre språk...                            


6 svar

stemmer
15

Jeg har utviklet en IOC container kalt InversifyJS med avanserte avhengighet injeksjon funksjoner som kontekstuelle bindinger.

Du må følge 3 grunnleggende trinnene for å bruke det:

1. Legg merknader

Den annotering API er basert på vinkel 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. Om bindinger

Bindingen API er basert på 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. Løs avhengig

API vedtak er basert på Ninject:

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

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

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

Den nyeste versjonen (2.0.0) støtter mange bruksområder:

  • kjernemoduler
  • Kernel mellomvare
  • Bruk klasser, strenger eller symboler som avhengighet identifikatorer
  • Injeksjon av konstante verdier
  • Injeksjon av klasse konstruktører
  • Injeksjon av fabrikker
  • Auto fabrikk
  • Injeksjon av leverandører (asynkron fabrikken)
  • Aktiverings handlere (anvendt for å injisere fullmakt)
  • multi injeksjoner
  • Tagged bindinger
  • Custom tag dekoratører
  • Navngitte bindinger
  • kontekstuelle bindinger
  • Vennlig unntak (f.eks Rundskriv avhengigheter)

Du kan lære mer om det på https://github.com/inversify/InversifyJS

Svarte 07/05/2015 kl. 22:33
kilden bruker

stemmer
3

Jeg har laget DI bibliotek for Loggfila - huject

https://github.com/asvetliakov/huject

Eksempel:

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

Det er et problem med maskinskrevet manuskript grensesnitt skjønt, men jeg har 2 løsninger (bruke abstrakt eller enkelt klasse som grensesnitt)

Svarte 31/08/2015 kl. 00:13
kilden bruker

stemmer
3

For nå, kan du bruke avhengighet injeksjon i Javascript uten IOC del. Det er opp til deg om du skrive en "manuell" resolver, eller fabrikker, eller hva DI mønster du foretrekker.

Når ECMAScript 6 standarden er vedtatt, kan det gjøre begrepet IOC mulig i Javascript.

Svarte 09/10/2012 kl. 10:28
kilden bruker

stemmer
2

Vi har brukt en enkel avhengighet injeksjon container som bruker AMD definere / krever - som syntaks. Den opprinnelige implementeringen er i maskinskrevet manuskript, selv om blogginnlegget under presenterer den i vanlig gamle Javascript.

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

Det er ganske enkelt å definere avhengighetsforhold uten å kreve en haug med konfigurasjon, og støtter sirkulære avhengigheter lik requirejs.

Her er et enkelt eksempel:

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

});
Svarte 12/11/2012 kl. 06:41
kilden bruker

stemmer
1

Alternativt kan du bare bruke noen rammer og bruke klassen som beholder med objekt fabrikker som egenskaper. Du kan deretter arve denne klassen i tester og endrings fabrikker. Denne tilnærmingen er å skrive trygt og ikke krever noen dekoratører, bare registrering av klasser.

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;
Svarte 15/10/2015 kl. 08:35
kilden bruker

stemmer
0

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

noe som dette er mulig:

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

@Service()
class SomeClass {

    someMethod() {
    }

}

let someClass = Container.get(SomeClass);
someClass.someMethod();
Svarte 03/12/2018 kl. 12:15
kilden bruker

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