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