Introduction
If you’ve worked with Dependency Injection (DI) in .NET, you’ve likely encountered the error:
InvalidOperationException: No service for type 'YourService' has been registered.
This is one of the most common errors in .NET and usually appears when you try to inject a service that hasn’t been registered in the DI container. The good news? It’s easy to fix once you understand the root cause.
In this article, we’ll break down this error in simple words, explain why it happens, show how to diagnose the issue, and walk through multiple solutions with real-world code examples.
1. Why the "No Service for Type" Error Happens
The error means:
You are trying to inject a service into a constructor or method
But .NET doesn’t know how to create it
Because you forgot to register it in the DI container
Example Error
public class HomeController : Controller
{
private readonly IEmailService _emailService;
public HomeController(IEmailService emailService)
{
_emailService = emailService; // ❌ Throws: No service for type IEmailService
}
}
If IEmailService is not registered in Program.cs, this error will occur.
2. Fix 1: Register the Service in Program.cs
The most common fix is to ensure that the service is registered.
Example
builder.Services.AddScoped<IEmailService, EmailService>();
Supported Lifetimes
AddTransient // new instance every time
AddScoped // one instance per request
AddSingleton // one instance for entire app
Once registered, DI knows how to create the service.
3. Fix 2: Ensure the Class is Public and Not Abstract
A service must be instantiable.
Wrong
internal class EmailService { }
Correct
public class EmailService : IEmailService { }
Why?
4. Fix 3: Ensure Constructor Parameters Match Registered Services
If a service depends on another service that is also not registered, you’ll get the same error.
Example
public class OrderService : IOrderService
{
public OrderService(IEmailService emailService, ILogger logger) { }
}
Both must be registered:
builder.Services.AddScoped<IEmailService, EmailService>();
builder.Services.AddScoped<ILogger, Logger>();
Hidden DI problem
Even if OrderService is registered, DI will still fail if dependencies are missing.
5. Fix 4: Check Namespace and File Imports
Sometimes the wrong interface is referenced.
Example Problem
Using:
using MyApp.Services;
instead of
using MyApp.Core.Services;
This causes .NET to look for a service registration of a different interface.
Tip
Always verify that the interface you inject matches the one you registered.
6. Fix 5: Ensure Correct Order of Registration in Extension Methods
Many apps use extension methods for service registration.
Example
public static void AddApplicationServices(this IServiceCollection services)
{
services.AddScoped<IUserService, UserService>();
}
If you forget to call it:
builder.Services.AddApplicationServices(); // Required
you will get the error.
7. Fix 6: Avoid Resolving Services in Program.cs Before Registration
Wrong
var email = builder.Services.BuildServiceProvider().GetService<IEmailService>();
Service not registered → DI error
Correct
Register first → then resolve only when needed
8. Fix 7: Ensure You Are Injecting an Interface, Not a Concrete Type
If you register only the interface, injecting the concrete type fails.
Registration
services.AddScoped<IEmailService, EmailService>();
Wrong injection
public HomeController(EmailService service) { } // ❌ Not registered
Correct injection
public HomeController(IEmailService service) { }
9. Fix 8: Ensure the Service Has a Public Constructor
If the class constructor is private, DI cannot instantiate it.
Wrong
public class EmailService {
private EmailService() { }
}
Correct
public class EmailService {
public EmailService() { }
}
10. Fix 9: Register Generic Services Properly
Example
services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
If you forget this, injecting an IRepository<User> will fail.
11. Fix 10: Check Dependency Injection in Background Services
Hosted services resolve dependencies differently.
Example
public class EmailWorker : BackgroundService
{
private readonly IEmailService _emailService;
public EmailWorker(IEmailService emailService)
{
_emailService = emailService;
}
}
Make sure service is registered:
services.AddHostedService<EmailWorker>();
services.AddScoped<IEmailService, EmailService>();
12. Bonus: Add a Diagnostic Tool to Detect Missing DI Registrations
Use Scrutor to scan and register services automatically.
Install-Package Scrutor
Example
services.Scan(scan => scan
.FromAssemblyOf<IEmailService>()
.AddClasses()
.AsImplementedInterfaces()
.WithScopedLifetime());
This reduces DI errors significantly.
Best Practices for Avoiding “No Service for Type” Errors
Always register services before injecting
Prefer interfaces over concrete types
Keep DI registrations in dedicated extension methods
Check namespaces and file imports
Validate constructor parameters for missing dependencies
Use Scrutor for automatic scanning
Conclusion
The "No service for type" error in .NET is common but easy to fix. It simply means the DI container doesn’t know how to create the requested service. By registering services correctly, checking dependencies, understanding lifetimes, and using best practices, you can prevent this error and maintain clean, reliable dependency injection throughout your .NET application. With consistent DI patterns, your code becomes more modular, testable, and easier to maintain.