带有.NET 6控制台应用程序和ServiceCollection的AutoFac

发布于 2025-02-02 02:01:11 字数 2093 浏览 2 评论 0 原文

我正在尝试使用 serviceCollection 在控制台应用程序中填充 serviceCollection 。我阅读文档但没有针对我的特定情况的指南。

我面临的问题是,当我使用接口类型询问时,构建的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

I am trying to use ServiceCollection with Autofac populating the ServiceCollection in a Console App. I read through the documentation but there is no guide for my specific scenario.

The issue I am facing is that built ServiceCollection does not find the implementation when I ask with interface type. I think AutoFac is not populating the 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);
}

Error:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ゞ记忆︶ㄣ 2025-02-09 02:01:11

我认为问题在 addautofac 扩展方法仅在 asp.net core 1.1-2.2 中支持。

这不适用于ASP.NET Core 3+或.NET Core 3+通用托管支持-ASP.NET CORE 3已弃用从Configureservices返回服务提供商的能力。

如果我们想将AutoFac作为DI容器,则有一个示例可以谈论 netcore快速启动

一旦您注册了ServiceCollection中的所有内容并调用 pupulate 将这些注册通过 containerbuilder

final final创建 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>();

I think the problem is on AddAutofac extension method only supports during ASP.NET Core 1.1 - 2.2.

This is not for ASP.NET Core 3+ or the .NET Core 3+ generic hosting support - ASP.NET Core 3 has deprecated the ability to return a service provider from ConfigureServices.

if we want to use autofac to be the DI Container, there is an example to talk about netcore quick-start

Once you've registered everything in the ServiceCollection and call Populate to bring those registrations into Autofac by ContainerBuilder

Final, Creating a new AutofacServiceProvider makes the DI container and we can use that.

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>();
爺獨霸怡葒院 2025-02-09 02:01:11

文档说仅使用 addautofac

仅适用于pre-asp.net 3.0托管。这对ASP.NET Core 3.0+或通用托管不起作用。

因为 .net 6 已被标记。我认为该框架是问题的一部分。

这是我的实施以及一些可以帮助的文档。
https://autofac.readthedocs.io/en/latest/latest/integration/aspnetegration/aspnetcore.html

//

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

using IHost host = Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(builder =>
{
    builder.RegisterAssemblyTypes(Assembly.Load("Core")).AsImplementedInterfaces();
})
.Build();

var markDownParser = host.Services.GetRequiredService<IMarkDownParser>();
Console.WriteLine(markDownParser);

using Microsoft.Extensions.Logging;

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

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

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

        public object Parse(string text)
        {
           throw new NotImplementedException();
        }
    }
}

Documentation says that only use AddAutofac
ONLY FOR PRE-ASP.NET 3.0 HOSTING. THIS WON'T WORK FOR ASP.NET CORE 3.0+ OR GENERIC HOSTING.

Since .net 6 has been tagged. I'm thinking the framework is part of the issue.

Here is my implementation as well as some documentation to help.
https://autofac.readthedocs.io/en/latest/integration/aspnetcore.html

// Main

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

using IHost host = Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(builder =>
{
    builder.RegisterAssemblyTypes(Assembly.Load("Core")).AsImplementedInterfaces();
})
.Build();

var markDownParser = host.Services.GetRequiredService<IMarkDownParser>();
Console.WriteLine(markDownParser);

// Core Assembly

using Microsoft.Extensions.Logging;

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

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

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

        public object Parse(string text)
        {
           throw new NotImplementedException();
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文