@soerenuhrbach/query-bus
TypeScript icon, indicating that this package has built-in type declarations

1.1.1 • Public • Published

@soerenuhrbach/query-bus

A lightweight query bus for TypeScript/JavaScript.

Installation

Install by npm

npm install --save @soerenuhrbach/query-bus

or install with yarn

yarn add @soerenuhrbach/query-bus

Modify your tsconfig.json to include the following settings

{
  "compilerOptions": {
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  }
}

Add a polyfill for the Reflect API. You can use:

The Reflect polyfill import should only be added once, and before query bus is used:

// main.ts
import "reflect-metadata";

// Your code here...

Usage

Creating a query

// test-query.ts
import { Query, QueryInterface, clone } from "@soerenuhrbach/query-bus";

@Query()
class TestQuery implements QueryInterface {
  protected response = null;

  public getResponse() { return this.response; }

  public withResponse(response: any) {
    return clone(this, { response });
  }
}

Creating a query handler

// test-query-handler.ts
import { TestQuery } from './test-query'; 
import { QueryHandler, QueryHandlerInterface } from "@soerenuhrbach/query-bus";

@QueryHandler(TestQuery)
class TestQueryHandler implements QueryHandlerInterface<TestQuery> {
  public handle(query: TestQuery): TestQuery {
    return query.withResponse('response');
  }
}

Register query and query handler

With using "@QueryHandler()" decorator

// main.ts
import { QueryBus } from '@soerenuhrbach/query-bus';
import { TestQueryHandler } from './test-query-handler';

const bus = new QueryBus();
bus.registerHandler(TestQueryHandler);

Without using "@QueryHandler()" decorator

// main.ts
import { QueryBus } from '@soerenuhrbach/query-bus';
import { TestQuery } from './test-query';
import { TestQueryHandler } from './test-query-handler';

const bus = new QueryBus();
bus.register(TestQuery, TestQueryHandler);

Execute query

// main.ts
import { QueryBus } from '@soerenuhrbach/query-bus';
import { TestQuery } from './test-query';
import { TestQueryHandler } from './test-query-handler';

const bus = new QueryBus();
bus.register(TestQuery, TestQueryHandler);

bus.dispatch(new TestQuery)
  .then((query) => console.log('value is ', query.getResponse()));

Using query bus with your own di container

By default this package uses the di container provided by the package '@soerenuhrbach/di'. You can use your own di container by passing your container as constructor parameter.

// main.ts
import { QueryBus } from '@soerenuhrbach/query-bus';
import { ContainerInterface } from '@soerenuhrbach/di';

const container: ContainerInterface = new CustomContainer();
const bus = new QueryBus(container);

Readme

Keywords

none

Package Sidebar

Install

npm i @soerenuhrbach/query-bus

Weekly Downloads

0

Version

1.1.1

License

MIT

Unpacked Size

32.5 kB

Total Files

54

Last publish

Collaborators

  • soerenuhrbach