This probably depends on the complexity of your application and requires some judgment that comes with experience. The short answer is that if your project is more than pretty simple, then it's best for you to put your logic in the domain classes.
Longer answer:
If you put your logic at the service level, you are emotionally following the script transaction scheme and ending with the anemic domain model . This may be a valid route, but it usually works best with simple and small projects. The problem is that the transaction level of the script (your service level) becomes more difficult to maintain as it grows.
Thus, an alternative is to create a rich domain model that contains the logic inside it. Keeping the logic together with the class to which it belongs is a key part of good OO design, and is very important in a complex project. This usually requires a little more thought and effort, so for very simple projects, people sometimes use a script transaction template.
If you are not sure what to do with it, it is usually not a very difficult task to reorganize your logic in order to move it from your service level to a domain, but you need to make a call early enough so that the work is not too big.
Unlike one of the answers, using POCO classes does not mean that you cannot have business logic in your domain classes. POCO does not apply infrastructure-specific structures for your domain classes , such as methods and interfaces specific to a particular ORM. A class with some functions for applying business logic obviously remains a Plain-Old-CLR-Object.
source share