Comments (6)
For example, If you need to get a user, you can create a port:
interface GetUserPort {
getUser(id: string): Promise<User>
}
And adapter (repository in this case is an adapter for the database):
class UserRepository implements GetUserPort {
async getUser(id: string): Promise<User> {
const user = await this.database.query('SELECT * FROM users WHERE id = $1', [id]);
return user;
}
If you need to get a user from an external api, the principle is the same:
class UserAdapter implements GetUserPort {
async getUser(id: string): Promise<User> {
const user = await fetch('http://some-external-api.com', { userId: id });
return user;
}
In the service where you need to use this adapter you would do something like this:
export class UserService {
constructor(
@Inject(UserAdapter) // <- inject adapter
private user: GetUserPort; // <- service itself depends on a port
) {}
async doSomething(id: string) {
const user = await this.user.getUser(id);
// ...
}
from domain-driven-hexagon.
It's ok for external DB or HTTP API, but what about calling other microservices (Kafka, Rabbit)? Because I saw "microservice adapters" part of the diagram.
from domain-driven-hexagon.
Same principles can be applied for any out-of-process communications. Your domain doesn't need to know how your microservices communicate: via HTTP, RabbitMQ, Kafka, etc. Domain doesn't care about that details, it just calls a port to do something, and adapter gets care of that. This is simple abstraction principle.
For example, using RabbitMQ RPC
class UserAdapter implements GetUserPort {
async getUser(id: string): Promise<User> {
await this.rabbitMQ.sendToQueue('GET_USER', { userId: id }, {
replyTo: queue
});
const user = await channel.consume(queue, /* ... listen for RPC response */)
return user;
}
from domain-driven-hexagon.
@Sairyss thanks, great project!
from domain-driven-hexagon.
What if some part of user
is stored in database and other part is stored in 3rd party storage? How can we get whole user from the application service?
from domain-driven-hexagon.
What if some part of
user
is stored in database and other part is stored in 3rd party storage? How can we get whole user from the application service?
@ErlanBazarov You can combine a call to your db and a call to external service into a single method getUser
, but I don't see many reasons to do that. 3rd party storage is not something you can control, what if it becomes unaccessible for any reason? All calls to getUser
will fail. Or what if it goes out of business? You will lose your users data.
What you usually should do in that case is create a copy of that data stored in 3rd party service into your own database, storage is cheap nowadays. If data gets updated frequently in the 3rd party storage, you can use periodic jobs to keep it fresh in your db. This way you will not depend that much on a 3rd party.
from domain-driven-hexagon.
Related Issues (20)
- `StructuredClone()` function converts entity object into plain object, causing `undefined` properties when calling getters HOT 2
- @slonik/migrator is not compatible with slonik 30+ HOT 9
- InternalServerErrorException has incorrect documentation HOT 1
- FindUsersQuery should map data to response in order to avoid leaks HOT 1
- Why are ports defined in infrastructure layer? HOT 2
- Intermittent test failure for create-user HOT 7
- Clarification on the Practical Usage of Domain Services in DDD
- typeof id is undefined HOT 4
- execute start:dev throws error HOT 6
- Enable GitHub discussions ? HOT 1
- Correct approach for different types of concept? HOT 1
- UnitOfWork creating many QueryRunners and not release them HOT 4
- Types are incorrect for value object's unpack method
- Dependency Inversion in new version HOT 1
- Queries using repositories HOT 1
- Query handler breaking the dependency rule? HOT 4
- Authentication module HOT 1
- Resolver returning type HOT 1
- resolver return HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from domain-driven-hexagon.