Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.NET Core Web App DI Error - Some services are not able to be constructed (Error while validating the service descriptor

I am creating a ASP.NET Core web application. I am using a Repository through a library project. I reference it in the web application project.

The repository interface is as below:

public interface IPushNotificationRepository
{
    IQueryable<PushNotification> Notifications
    {
        get;
    }
    IQueryable<Client> Clients
    {
        get;
    }

    void Add(PushNotification notification);
    void Add(Client client);
    void AddRange(IList<PushNotification> notifications);
    bool AddIfNotAlreadySent(PushNotification notification);
    void UpdateDelivery(PushNotification notification);
    bool CheckIfClientExists(string client);
    Client FindClient(int? id);
    void Update(Client client);
    void Delete(Client client);
}

Within the repository I inject the db context

    public class PushNotificationRepository : IPushNotificationRepository
    {
        private readonly PushNotificationsContext _context;

        public PushNotificationRepository(PushNotificationsContext context)
        {
            _context = context;
        }
}

The configure services of the start up class is as below:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddSingleton<IPushNotificationRepository, PushNotificationRepository>();
    services.AddDbContextPool<PushNotificationsContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("PushNotificationsConnection")));
}

In the controller class I consume the repository:

    public class ClientsController : Controller
    {
        //private readonly PushNotificationsContext _context;
        private readonly IPushNotificationRepository _pushNotificationRepository;

        public ClientsController(IPushNotificationRepository pushNotificationRepository)
        {
            _pushNotificationRepository = pushNotificationRepository;
        }
}

The repository classes are in a separate library project which is referenced by the web application project. The error I receive is:

System.AggregateException: 'Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: Services.Messaging.Data.Abstract.IPushNotificationRepository Lifetime: Singleton ImplementationType: Services.Messaging.Data.PushNotificationRepository': Cannot consume scoped service 'Services.Messaging.Data.PushNotificationsContext' from singleton 'Services.Messaging.Data.Abstract.IPushNotificationRepository'.)'

Would really appreciate some advise on this

like image 221
sm101 Avatar asked Feb 20 '20 14:02

sm101


1 Answers

A singleton cannot reference a Scoped instance. The error message is clear.

Cannot consume scoped service 'Services.Messaging.Data.PushNotificationsContext' from singleton

PushNotificationsContext is considered as a scoped service. You should almost never consume scoped service or transient service from a singleton. You should also avoid consuming transient service from a scoped service. Consuming scoped services it's a good practice to inject what you need, it gets cleaned up after the request automatically.

Either

services.AddTransient < IPushNotificationRepository, PushNotificationRepository>();

or

services.AddScoped< IPushNotificationRepository, PushNotificationRepository>();

will work fine, but check your design. Maybe this is not the behaviour you are looking for.

like image 102
David Donari Avatar answered Sep 19 '22 16:09

David Donari