DEV Community

Supraja Tangella
Supraja Tangella

Posted on

๐—ช๐—ต๐—ฎ๐˜ ๐—œ๐˜€ ๐—ฎ ๐—จ๐˜€๐—ฒ ๐—–๐—ฎ๐˜€๐—ฒ ๐—ถ๐—ป ๐—–๐—น๐—ฒ๐—ฎ๐—ป ๐—”๐—ฟ๐—ฐ๐—ต๐—ถ๐˜๐—ฒ๐—ฐ๐˜๐˜‚๐—ฟ๐—ฒ โ€“ ๐—”๐—ป๐—ฑ ๐—ช๐—ต๐˜† ๐—œ๐˜ ๐— ๐—ฎ๐˜๐˜๐—ฒ๐—ฟ๐˜€ ๐—ถ๐—ป ๐—ฅ๐—ฒ๐—ฎ๐—น-๐—ช๐—ผ๐—ฟ๐—น๐—ฑ ๐—ฃ๐—ฟ๐—ผ๐—ท๐—ฒ๐—ฐ๐˜๐˜€

In my recent ๐—˜๐—บ๐—ฝ๐—น๐—ผ๐˜†๐—ฒ๐—ฒ ๐—ฃ๐—ฒ๐—ฟ๐—ณ๐—ผ๐—ฟ๐—บ๐—ฎ๐—ป๐—ฐ๐—ฒ ๐—ฅ๐—ฒ๐˜ƒ๐—ถ๐—ฒ๐˜„ ๐—ฆ๐˜†๐˜€๐˜๐—ฒ๐—บ project, I implemented the ๐—จ๐˜€๐—ฒ ๐—–๐—ฎ๐˜€๐—ฒ ๐—ฃ๐—ฎ๐˜๐˜๐—ฒ๐—ฟ๐—ป as part of the ๐—–๐—น๐—ฒ๐—ฎ๐—ป ๐—”๐—ฟ๐—ฐ๐—ต๐—ถ๐˜๐—ฒ๐—ฐ๐˜๐˜‚๐—ฟ๐—ฒ approach โ€” and it transformed the way I structured my application logic.

๐Ÿงฉ What is a Use Case in Clean Architecture?

A ๐—จ๐˜€๐—ฒ ๐—–๐—ฎ๐˜€๐—ฒ represents a ๐˜€๐—ถ๐—ป๐—ด๐—น๐—ฒ ๐—ฏ๐˜‚๐˜€๐—ถ๐—ป๐—ฒ๐˜€๐˜€ ๐—ผ๐—ฝ๐—ฒ๐—ฟ๐—ฎ๐˜๐—ถ๐—ผ๐—ป ๐—ผ๐—ฟ ๐—ถ๐—ป๐˜๐—ฒ๐—ฟ๐—ฎ๐—ฐ๐˜๐—ถ๐—ผ๐—ป from the user's perspective, such as:

  • CreateReview, SubmitReview, UpdateReview, DeleteReview

It fits into the ๐—”๐—ฝ๐—ฝ๐—น๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป ๐—Ÿ๐—ฎ๐˜†๐—ฒ๐—ฟ, where it:
โœ… Orchestrates application rules
โœ… Uses domain entities & value objects
โœ… Calls interfaces like IReviewRepository
โœ… Does ๐—ป๐—ผ๐˜ depend on frameworks, databases, or UI code

๐Ÿ› ๏ธ Example: Using Repository in Use Case

public class CreateReviewUseCase
{
private readonly IReviewRepository _reviewRepository;

public CreateReviewUseCase(IReviewRepository reviewRepository)
{
    _reviewRepository = reviewRepository;
}

public async Task ExecuteAsync(CreateReviewDto dto)
{
    var review = new EmployeeReview(dto.EmployeeId, ReviewScore.Create(dto.Score), dto.Comments);
    await _reviewRepository.AddAsync(review);
}
Enter fullscreen mode Exit fullscreen mode

}

This use case calls the repository but knows nothing about the actual database.

๐Ÿง  How We Use It in the Controllers:

In your Controllers or API Endpoints, you can simply call the use case:

public async Task CreateReview(CreateReviewDto model)
{
await _createReviewUseCase.ExecuteAsync(model);
return RedirectToAction("Success");
}

This separation keeps controllers ๐˜๐—ต๐—ถ๐—ป ๐—ฎ๐—ป๐—ฑ ๐—ฐ๐—น๐—ฒ๐—ฎ๐—ป, and ensures ๐—ฏ๐˜‚๐˜€๐—ถ๐—ป๐—ฒ๐˜€๐˜€ ๐—น๐—ผ๐—ด๐—ถ๐—ฐ ๐—น๐—ถ๐˜ƒ๐—ฒ๐˜€ ๐—ถ๐—ป ๐˜๐—ต๐—ฒ ๐—ฟ๐—ถ๐—ด๐—ต๐˜ ๐—ฝ๐—น๐—ฎ๐—ฐ๐—ฒ.

If you're aiming to build ๐˜€๐—ฐ๐—ฎ๐—น๐—ฎ๐—ฏ๐—น๐—ฒ, ๐˜๐—ฒ๐˜€๐˜๐—ฎ๐—ฏ๐—น๐—ฒ, ๐—ฎ๐—ป๐—ฑ ๐—ฐ๐—น๐—ฒ๐—ฎ๐—ป ๐—ฎ๐—ฝ๐—ฝ๐—น๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป๐˜€, try applying ๐—จ๐˜€๐—ฒ ๐—–๐—ฎ๐˜€๐—ฒ ๐—ฃ๐—ฎ๐˜๐˜๐—ฒ๐—ฟ๐—ป in the ๐—”๐—ฝ๐—ฝ๐—น๐—ถ๐—ฐ๐—ฎ๐˜๐—ถ๐—ผ๐—ป ๐—Ÿ๐—ฎ๐˜†๐—ฒ๐—ฟ โ€” it makes your business rules easier to manage and evolve.

๐—›๐—ฎ๐˜ƒ๐—ฒ ๐˜†๐—ผ๐˜‚ ๐—ฒ๐˜ƒ๐—ฒ๐—ฟ ๐˜„๐—ผ๐—ป๐—ฑ๐—ฒ๐—ฟ๐—ฒ๐—ฑ ๐—ต๐—ผ๐˜„ ๐˜๐—ผ ๐—ผ๐—ฟ๐—ด๐—ฎ๐—ป๐—ถ๐˜‡๐—ฒ ๐—ฏ๐˜‚๐˜€๐—ถ๐—ป๐—ฒ๐˜€๐˜€ ๐—น๐—ผ๐—ด๐—ถ๐—ฐ ๐—ฐ๐—น๐—ฒ๐—ฎ๐—ป๐—น๐˜† ๐˜„๐—ถ๐˜๐—ต๐—ผ๐˜‚๐˜ ๐˜๐—ถ๐—ด๐—ต๐˜๐—น๐˜† ๐—ฐ๐—ผ๐˜‚๐—ฝ๐—น๐—ถ๐—ป๐—ด ๐—ถ๐˜ ๐˜๐—ผ ๐˜†๐—ผ๐˜‚๐—ฟ ๐—จ๐—œ ๐—ผ๐—ฟ ๐—ฑ๐—ฎ๐˜๐—ฎ ๐—ฎ๐—ฐ๐—ฐ๐—ฒ๐˜€๐˜€ ๐—น๐—ฎ๐˜†๐—ฒ๐—ฟ?

Top comments (0)