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