What criteria do you use when deciding between interface and abstract class in service and repository contracts?