Single Responsibility Principle (SRP) in .NET Core


As a developer with one year of experience, you've likely come across the SOLID principles, a set of five principles that promote clean, maintainable, and scalable code. Among these principles, the Single Responsibility Principle (SRP) is fundamental and worth mastering. In this article, we'll explain SRP in a beginner-friendly manner and provide a straightforward .NET Core example to illustrate its significance.

What is SRP?

The Single Responsibility Principle (SRP) is the first letter in SOLID, and it focuses on keeping your code concise and well-organized. In simple terms, SRP states that a class should have one, and only one, reason to change. In other words, a class should have a single responsibility or purpose.

To grasp this concept, think of real-world analogies. Consider a kitchen appliance like a toaster. Its sole responsibility is to toast bread; it doesn't brew coffee or perform any unrelated tasks. Similarly, in software development, classes should have a singular purpose.

Why is SRP Important?

  1. Readability: Classes with a single responsibility are easier for you and other developers to understand, improving code readability and maintainability.
  2. Reusability: When a class does one thing well, it's more likely to be reusable in different parts of your application without causing unintended side effects.
  3. Testing: Smaller, focused classes are simpler to test. You can write specific tests for a class's single responsibility, making it easier to catch and fix bugs.

A Simplified Example in .NET Core

Let's dive into a straightforward .NET Core example to demonstrate SRP.

User Class

In this example, we have a User class responsible for managing user-related data such as name, email address, and age. This class has a single responsibility: handling user data.

public class User
    public string Name { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }

    public User(string name, string email, int age)
        Name = name;
        Email = email;
        Age = age;

NotificationService Class

Next, we create a NotificationService class. This class is responsible for sending notifications to users. It could send emails, SMS, or other forms of communication. The crucial point is that it has a single responsibility: handling notifications.

public class NotificationService
    public void SendEmail(User user, string message)
        // Code to send an email notification
        Console.WriteLine($"Email sent to {user.Name}: {message}");

    public void SendSMS(User user, string message)
        // Code to send an SMS notification
        Console.WriteLine($"SMS sent to {user.Name}: {message}");

In this example, the User class deals with user data, while the NotificationService class manages sending notifications. This clear separation of responsibilities aligns with the Single Responsibility Principle.

Using the Classes

Here's how you can use these classes in your application.

public class Program
    public static void Main()
        var user = new User("Alice", "[email protected]", 30);
        var notificationService = new NotificationService();

        // Sending a notification to the user
        notificationService.SendEmail(user, "Hello, Ashutosh! Don't forget about our meeting.");
        notificationService.SendSMS(user, "Reminder: Meeting today at 3 PM.");

This example demonstrates how to the SRP keeps your code well-organized, maintainable, and extensible. For a new developer(fresher), these principles will help you to build more robust and scalable applications. Using SRP, you'll be on your way to becoming a more proficient and efficient developer.

In your journey as a software developer, remember that simplicity and following to fundamental principles like SRP are key to producing high-quality software.


Single Responsibility Principle (SRP) tells us that each class should have only one job, just like a toaster's job is to toast bread. It's important because it makes code easier to read, reuse, and test.

In our .NET Core example, we had a User class for user data and a NotificationService class for sending messages. This separation makes our code more organized and adaptable.

😊Please consider liking and following me for more articles and if you find this content helpful.👍

Similar Articles