It is highly recommended to
NOT modify the original source code. Plugins are definitely ideal for portability across multiple installations, but if it's just you and your team and 1 installation, or if plugins/widgets just do not suit your needs, then there numerous other ways to implement changes. It really only depends on what you're trying to do.
Nearly every class is partial, so additional properties and methods are easy to add in a separate .cs file. Or (in 4.3+) add to a domain entity with migrations:
https://docs.nopcommerce.com/en/developer/tutorials/update-existing-entity.htmlYou can override base methods through inheritance and register them higher with IDependencyRegistrar, or change the signature in your method and call it instead of the original (again, in separate .cs files).
Create your own controllers and register their custom routes:
https://docs.nopcommerce.com/en/developer/tutorials/register-new-routes.htmlYou can create Consumers for dozens of published Events, as well as Entity Updated/Inserted/Deleted and OnModelCreating.
https://docs.nopcommerce.com/en/developer/tutorials/entity-event.htmlIf a specific Event doesn't already exist (
or you don't want to create it), you can create Action Filters for intercepting controller actions before/after they execute:
https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-5.0You can create your own settings:
https://docs.nopcommerce.com/en/developer/tutorials/settings.htmlor your own background tasks:
https://docs.nopcommerce.com/en/developer/tutorials/scheduled-tasks.htmlModify any .cshtml View file and drop it in the appropriate matching directory in Themes, and it will be picked up after the original file.
The only limitation I've encountered is Enums (like OrderStatus) which can't be partial or inherited from. Outside of that, the original source does not need to be touched.
If you post up an example of a few of your changes then the community can narrow in on the best practice for it pretty quickly.