Failed to resolve service for type IOptions [DataAccessConfiguration] in nonASP.NET Core application

All our business services were previously configured to use Injection Dependency with IOptions because they were consumed by ASP.NET Core applications, for example:

NotificationDataAccess.cs:

public class NotificationDataAccess : BaseDataAccess, INotificationDac<Notification>
    {
        public NotificationDataAccess(IOptions<DataAccessConfiguration> options, IClaimsAccessor claimsAccessor) :
            base(options, claimsAccessor)
        {
        }
}

NotificationBusinessService.cs:

public class NotificationBusinessServices : INotificationServices<Notification>
    {
        private readonly INotificationDac<Notification> _notificationDataAccess;

        public NotificationBusinessServices(
            INotificationDac<Notification> notifcationDataAccess)
        {
            _notificationDataAccess = notifcationDataAccess;
        }
}

Now I have the unenviable task of trying to figure out how to use the same template from the Windows service, which does not allow using the built-in ASP.NET Core functions for processing DI. When the service starts, I execute the following code:

// Set up configuration, services, and logging.
            IServiceCollection services = new ServiceCollection();
            var startup = new Startup();
            startup.ConfigureServices(services);
            IServiceProvider serviceProvider = services.BuildServiceProvider();

            var configuration = serviceProvider.GetService<IConfigurationRoot>();
            var notificationService = serviceProvider.GetService<INotificationServices<Notification>>();// TODO: This errors!
            processor = new Processor(configuration, notificationService);

And here is the Startup.cs code that the services should configure:

public class Startup
    {
        IConfigurationRoot Configuration { get; }

        public Startup()
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(Path.Combine(AppContext.BaseDirectory))
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddEnvironmentVariables();
            Configuration = builder.Build();
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton<IConfigurationRoot>(Configuration);
            //services.AddMvc();

            // Add application services.
            Listings.Business.Configuration.Instance = new BusinessLayerConfiguration();
            services.Configure<DataAccessConfiguration>(options => Configuration.GetSection("Data").Bind(options));
            services.AddScoped(typeof(INotificationDac<Notification>), typeof(NotificationDataAccess));
            services.AddScoped(typeof(INotificationServices<Notification>), typeof(NotificationBusinessServices));
        }
    }

Unfortunately, when I start the Windows service, it throws an exception when trying to get a notification:

var notificationService = serviceProvider.GetService<INotificationServices<Notification>>();

The exception is:

System.InvalidOperationException: " 'Microsoft.Extensions.Options.IOptions`1 [Rpr.Listings.DataAccess.DataAccessConfiguration] 'Rpr.Listings.DataAccess.NotificationDataAccess' '.

, "services.Configure" , , , . , IOptions Startup.cs, , . -, ASP.NET MVC? "Services.AddMvc();" ? , ASP.NET MVC Windows, .

, , IOptions, !

+4
1

, , , :

services.AddOptions();

, IOptions !

+10

Source: https://habr.com/ru/post/1691659/


All Articles