AutoFac的依赖注入

时间:2020-11-12 20:44:17

标签: c# autofac

我不断收到错误消息,说我在类Service中创建的构造函数参数没有可用的构造函数。

这是代码:

Main.cs

public static void Main(string[] args)
{
        ContainerBuilder containerBuilder = new ContainerBuilder();
        containerBuilder.RegisterType<Service>().AsSelf().InstancePerLifetimeScope();

        containerBuilder.RegisterAssemblyTypes(typeof(IServiceScopeFactory).Assembly).As<IServiceScopeFactory>();
        containerBuilder.RegisterAssemblyTypes(typeof(IConfiguration).Assembly).As<IConfiguration>();

        IContainer container = containerBuilder.Build();

        HostFactory.Run(configure =>
        {
            configure.Service<Service>(s =>
            {
                s.ConstructUsing(hostSettings => container.Resolve<Service>());
                s.WhenStarted(tc => tc.Start());
                s.WhenStopped(tc => tc.Stop());
            });
        });
}

Service.cs

public class Service
{
    private readonly IServiceScopeFactory _serviceScopeFactory;
    private readonly IConfiguration _configuration;

    public Service(IServiceScopeFactory serviceScopeFactory, IConfiguration configuration)
    {
        _serviceScopeFactory =   serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory));
        _configuration = configuration;
    }
}

我在做什么错了?

谢谢。

1 个答案:

答案 0 :(得分:0)

对不起,删除了我之前的答案,但保留您的评论:

我一直得到的错误是:不能使用可用的服务和参数调用类型为“ WindowsService.Service”的“ Autofac.Core.Activators.Reflection.DefaultConstructorFinder”找到的构造函数:无法解析参数“ Microsoft” .Extensions.DependencyInjection.IServiceScopeFactory serviceScopeFactory'的构造函数'Void .ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,Microsoft.Extensions.Configuration.IConfiguration)'

我有一个类似的项目,并添加了IServiceScopeFactory并设法重现了该问题。我也相信找到了解决方案。因此,请尝试以下操作:

    public static void Main(string[] args)
    {
        ContainerBuilder containerBuilder = new ContainerBuilder();
        containerBuilder.RegisterType<Service>().AsSelf().InstancePerLifetimeScope();
 containerBuilder.RegisterAssemblyTypes(typeof(IServiceScopeFactory).Assembly).As<IServiceScopeFactory>();
        containerBuilder.RegisterAssemblyTypes(typeof(IConfiguration).Assembly).As<IConfiguration>();

           // Add these
           var serviceCollection = new ServiceCollection();
           containerBuilder.Populate(serviceCollection);
           containerBuilder.RegisterType<Service>().AsSelf();

           ....
}

我还需要安装一些软件包:

using Microsoft.Extensions.DependencyInjection;
using Autofac.Extensions.DependencyInjection;