[英]Autofac with .NET 6 console app and ServiceCollection
我正在嘗試將ServiceCollection
與 Autofac 一起使用,以在控制台應用程序中填充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
我認為問題在於AddAutofac
擴展方法僅在ASP.NET Core 1.1 - 2.2期間支持。
這不適用於 ASP.NET Core 3+ 或 .NET Core 3+ 通用托管支持 - ASP.NET Core 3 已棄用從 ConfigureServices 返回服務提供者的能力。
如果我們想用autofac做DI Container,有一個例子講一下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>();
文檔說只使用AddAutofac
ONLY FOR PRE-ASP.NET 3.0 HOSTING. THIS WON'T WORK FOR ASP.NET CORE 3.0+ OR GENERIC HOSTING.
由於.net 6
已被標記。 我認為框架是問題的一部分。
這是我的實現以及一些幫助文檔。
https://autofac.readthedocs.io/en/latest/integration/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();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.