Hi @fatih uyanık,
So wouldn't doing database validations inside services be considered against solid principles?
No, database validation is part of the business logic and is placed in the Service Layer in accordance with the SOLID principles.
Would it be a good practice to move service validations to separate validator classes and do all the validations there and call them from the service? Or would it be unnecessary?
It depends on complexity. Here are two approaches:
First, you could Keep Model & Database Validations Separate.
Model validation → FluentValidation (BookValidator
)
Database validation → Service Layer (BookService
)
public class BookService : IBookService
{
private readonly IBookRepository _bookRepository;
private readonly IValidator<Book> _bookValidator;
public BookService(IBookRepository bookRepository, IValidator<Book> bookValidator)
{
_bookRepository = bookRepository;
_bookValidator = bookValidator;
}
public void Save(Book book)
{
// Model validation
_bookValidator.ValidateAndThrow(book);
// Database validation
if (_bookRepository.Exists(book.Title))
throw new ValidationException("Book already exists.");
// Proceed with saving
_bookRepository.Add(book);
}
}
Second, If database validation logic becomes too complex, you can create a separate validation class:
public class BookBusinessValidator
{
private readonly IBookRepository _bookRepository;
public BookBusinessValidator(IBookRepository bookRepository)
{
_bookRepository = bookRepository;
}
public void ValidateBookRules(Book book)
{
if (_bookRepository.Exists(book.Title))
throw new ValidationException("Book already exists.");
}
}
public class BookService : IBookService
{
private readonly IBookRepository _bookRepository;
private readonly IValidator<Book> _bookValidator;
private readonly BookBusinessValidator _bookBusinessValidator;
public BookService(IBookRepository bookRepository, IValidator<Book> bookValidator, BookBusinessValidator bookBusinessValidator)
{
_bookRepository = bookRepository;
_bookValidator = bookValidator;
_bookBusinessValidator = bookBusinessValidator;
}
public void Save(Book book)
{
_bookValidator.ValidateAndThrow(book);
_bookBusinessValidator.ValidateBookRules(book);
_bookRepository.Add(book);
}
}
You could use first suggestion (Service Layer Validations) unless the validation logic is complex. 🚀
You could use second suggestion (Separate Validator Class) only if multiple services need the same database validation logic.