C# 无法解析非ASP.NET核心应用程序中IOptions[DataAccessConfiguration]类型的服务

C# 无法解析非ASP.NET核心应用程序中IOptions[DataAccessConfiguration]类型的服务,c#,dependency-injection,.net-core,C#,Dependency Injection,.net Core,我们所有的业务服务之前都设置为使用IOptions的依赖项注入,因为ASP.NET核心应用程序正在使用这些服务,如下所示: NotificationDataAccess.cs: public class NotificationDataAccess : BaseDataAccess, INotificationDac<Notification> { public NotificationDataAccess(IOptions<DataAccessConf

我们所有的业务服务之前都设置为使用IOptions的依赖项注入,因为ASP.NET核心应用程序正在使用这些服务,如下所示:

NotificationDataAccess.cs:

public class NotificationDataAccess : BaseDataAccess, INotificationDac<Notification>
    {
        public NotificationDataAccess(IOptions<DataAccessConfiguration> options, IClaimsAccessor claimsAccessor) :
            base(options, claimsAccessor)
        {
        }
}
公共类NotificationDataAccess:BaseDataAccess、INotificationDac
{
公共通知数据访问(IOptions选项、IClaimsAccessor claimsAccessor):
基本(选项、索赔访问者)
{
}
}
NotificationBusinessService.cs:

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

        public NotificationBusinessServices(
            INotificationDac<Notification> notifcationDataAccess)
        {
            _notificationDataAccess = notifcationDataAccess;
        }
}
公共类NotificationBusinessServices:INotificationServices
{
私有只读INotificationDac_notificationDataAccess;
公共通知商业服务(
INotificationDac notifcationDataAccess)
{
_notificationDataAccess=notificationDataAccess;
}
}
现在,我要做的是尝试找出如何利用windows服务中的相同模式,这是一项不可行的任务,因为它无法从处理DI的内置ASP.NET核心功能中获益。当服务启动时,我执行以下代码:

// 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);
//设置配置、服务和日志记录。
IServiceCollection服务=新的ServiceCollection();
var startup=新启动();
启动。配置服务(服务);
IServiceProvider serviceProvider=services.BuildServiceProvider();
var configuration=serviceProvider.GetService();
var notificationService=serviceProvider.GetService();//TODO:这是一个错误!
处理器=新处理器(配置、通知服务);
下面是Startup.cs代码,用于配置服务:

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));
        }
    }
公共类启动
{
IConfigurationRoot配置{get;}
公共启动()
{
var builder=new ConfigurationBuilder()
.SetBasePath(Path.Combine(AppContext.BaseDirectory))
.AddJsonFile(“appsettings.json”,可选:false,reloadOnChange:true)
.AddenEnvironmentVariables();
Configuration=builder.Build();
}
public void配置服务(IServiceCollection服务)
{
services.AddSingleton(配置);
//services.AddMvc();
//添加应用程序服务。
Listings.Business.Configuration.Instance=新的BusinessLayerConfiguration();
services.Configure(options=>Configuration.GetSection(“数据”).Bind(options));
addScope(typeof(INotificationDac),typeof(NotificationDataAccess));
服务.addScope(typeof(INotificationServices)、typeof(NotificationBusinessServices));
}
}
不幸的是,当我运行windows服务时,它在尝试获取notificationService时引发异常:

var notificationService = serviceProvider.GetService<INotificationServices<Notification>>();
var notificationService=serviceProvider.GetService();
例外情况是:

System.InvalidOperationException:'无法解析类型的服务 'Microsoft.Extensions.Options.IOOptions'1[Rpr.Listings.DataAccess.DataAccessConfiguration]' 试图激活时 'Rpr.Listings.DataAccess.NotificationDataAccess'。'

我希望我的“services.Configure”代码能够解决这个问题,但遗憾的是没有。显然,我需要在Startup.cs中注册IOptions,但我不知道如何做到这一点。这是ASP.NET MVC中经常发生的事情吗?“services.AddMvc();”是否正常注册此绑定?我可以这么说,但需要将大量ASP.NETMVC软件包导入到我的windows服务中,这是我不愿意做的


请让我知道如何正确注册IOPS绑定,谢谢

原来我所缺少的只是:

services.AddOptions();

一旦我添加了它,IOptions绑定就正确注册了

如果这对任何人都有帮助,我在一个控制台应用程序中遇到了这个问题,它是由创建服务提供商引起的

IServiceProvider serviceProvider = services.BuildServiceProvider();
在我注册配置之前

services.Configure<DataAccessConfiguration>(Configuration.GetSection("Data"));
services.Configure(Configuration.GetSection(“数据”);

如果您想在启动时连接某些东西,可以使用ninject扩展,这里的@T.S.近乎垃圾邮件。Ninject和什么有什么关系?OP正在使用Microsoft.Extensions.DependencyInjectionlibrary@CamiloTerevinto好的,伙计。这正是我使用的解决方案。效果很好。我以为OP抱怨MS的东西