我正在try 使用ServiceCollection和Autofac在控制台应用程序中填充ServiceCollection.我通读了the documentation篇,但没有针对我的具体场景的指南.

我面临的问题是,当我使用接口类型询问时,构建的ServiceCollection找不到实现.我认为AutoFac并没有在ServieCollection人中普及.

Program.cs

using System.Reflection;
using Autofac;
using Autofac.Extensions.DependencyInjection;
using Core.Interfaces;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;


var serviceProvider = new ServiceCollection()
    .AddLogging(cfg => cfg.AddConsole())
    .Configure<LoggerFilterOptions>(cfg => cfg.MinLevel = LogLevel.Information)
    .AddAutofac(cfg =>
    {
        cfg.RegisterAssemblyTypes(Assembly.Load("Core")).AsImplementedInterfaces();
    })
    .BuildServiceProvider();

var markDownParser = serviceProvider.GetRequiredService<IMarkDownParser>();

MarkDownParser.cs

namespace Core;

public class MarkDownParser : IMarkDownParser
{
    private readonly ILogger<MarkDownParser> _logger;

    public MarkDownParser(ILogger<MarkDownParser> logger)
    {
        _logger = logger;
    }
}

IMarkDownParser.cs

namespace Core.Interfaces;

public interface IMarkDownParser
{
    object Parse(string text);
}

错误:

Unhandled exception. System.InvalidOperationException: No service for type 'Core.Interfaces.IMarkDownParser' has been registered.
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
   at Program.<Main>$(String[] args) in /home/amir/RiderProjects/git-blog/ConsoleApp/Program.cs:line 20

推荐答案

我认为问题在于AddAutofac扩展方法只支持ASP.NET Core 1.1 - 2.2.

这不适用于ASP.NET Core 3+或.NET Core 3+通用托管支持-ASP.NET Core 3不赞成从ConfigureServices返回服务提供程序.

如果我们想使用autofac作为DI容器,下面有一个关于netcore quick-start的示例

一旦您在ServiceCollection中注册了所有内容,请致电Populate,在ContainerBuilder之前将这些注册信息带到Autofac中

最后,创建一个新的AutofacServiceProvider将生成DI容器,我们可以使用它.

var serviceCollection = new ServiceCollection()
    .AddLogging(cfg => cfg.AddConsole())
    .Configure<LoggerFilterOptions>(cfg => cfg.MinLevel = LogLevel.Information);

var containerBuilder = new ContainerBuilder();
containerBuilder.Populate(serviceCollection);
containerBuilder.RegisterAssemblyTypes(Assembly.Load("Core")).AsImplementedInterfaces();
var container = containerBuilder.Build();

var serviceProvider = new AutofacServiceProvider(container);
var markDownParser = serviceProvider.GetRequiredService<IMarkDownParser>();

Csharp相关问答推荐

使用其可能实现的基类和接口的属性的方法

如何使用Unity和MRTK3将手网添加到Hololens 2应用程序中

我无法在Ubuntu下编译使用microsoft.extension.configurationbuilder jsonapi和mono mcs的c#应用程序

并行令牌更新

可为空的泛型属性

查找表中的模式

Rider将.NET安装在哪里

方法从数据表中只 Select 一个条件?

C#和ASP.NET核心标识:提高GetUserAsync调用的性能

反序列化私有成员

如果设置了另一个属性,则Newtonsoft JSON忽略属性

CA1508:';NULL=>;TRUE;始终为';TRUE';.移除或重构条件(S)以避免死代码

.NET 8 DI GetServices<;对象&>不工作

使用System.Text.Json进行序列化时发生StackOverflow异常

当空判断结果赋给变量时,为什么会出现可能空异常警告的解引用?

获取混淆&Quot;模糊引用&Quot;错误

如何将默认区域性更改为fr-FR而不是en-US?

除非首先访问使用的终结点,否则本地API上的终结点不起作用

如何在C#中抽象Vector256;T<;的逻辑以支持不同的硬件配置?

异步等待,如何在Windows窗体中使用它们?