Добавление Autofac в .NET core 6.0 с использованием нового однофайлового шаблона

Я пытаюсь добавить Autofac в веб-API .Net 6.0. Я использую последний шаблон веб-API ASP.NET Core, который создает один запускаемый файл Program.cs.

Установленные версии Autofac:

      Autofac 6.3.0
Autofac.Extensions.DependancyInjection (7.2.0-preview.1)

Установлены версии .Net 6.0:

      Microsoft.AspNetCore.App 6.0.0-rc.2.21480.10
Microsoft.NETCore.App 6.0.0-rc.2.21480.5
Microsoft.WindowsDesktop.App 6.0.0-rc.2.21501.6

На всякий случай, это все содержимое файла Program.cs (да, без пространств имен или определения класса. Только файл Program.cs и никаких классов StartUp или Startup.cs)

      var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run()

Я пробовал просматривать последнюю документацию Autofac, но приведенные там примеры, несмотря на то, что говорят о .Net Core 3.x и более поздних версиях, не подходят для кода .Net 6.0. Я не могу понять, как добавить Autofac в конвейер промежуточного программного обеспечения.

Любая помощь приветствуется.

Фрагмент кода с сайта Autofac

      public class Program
{
  public static void Main(string[] args)
  {
    // ASP.NET Core 3.0+:
    // The UseServiceProviderFactory call attaches the
    // Autofac provider to the generic hosting mechanism.
    var host = Host.CreateDefaultBuilder(args)
        .UseServiceProviderFactory(new AutofacServiceProviderFactory())
        .ConfigureWebHostDefaults(webHostBuilder => {
          webHostBuilder
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>();
        })
        .Build();

    host.Run();
  }
}

Документация Autofac:

https://docs.autofac.org/en/latest/integration/aspnetcore.html#asp-net-core-3-0-and-generic-hosting

4 ответа

Я нашел это. https://docs.microsoft.com/en-us/aspnet/core/migration/50-to-60-samples?view=aspnetcore-5.0

var builder = WebApplication.CreateBuilder (аргументы);

builder.Host.UseServiceProviderFactory (новый AutofacServiceProviderFactory ());

// Зарегистрируйте сервисы напрямую в Autofac здесь. Не вызывайте // builder.Populate (), который происходит в AutofacServiceProviderFactory. builder.Host.ConfigureContainer (builder => builder.RegisterModule (новый MyApplicationModule()));

var app = builder.Build();

В «Программа.cs»

Ты найдешь

      var builder = WebApplication.CreateBuilder(args);

Добавить ниже

      builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())
    .ConfigureContainer<ContainerBuilder>(builder =>
    {
        builder.RegisterModule(new AutofacBusinessModule());
    });

Ответ выше, я предположил, что все остальное у вас настроено. Я использую Autofac и Autofact.Extras.DynamicProxy.

Делюсь ниже моим AutofacBusinessModule только для пояснения.

      public class AutofacBusinessModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterType<ProductManager>().As<IProductService>().SingleInstance();
            builder.RegisterType<EfProductDal>().As<IProductDal>().SingleInstance();
        }
    }

Здесь прикреплено, как я это реализовал

  1. Вызов UseServiceProviderFactoryв подсвойстве Host
  2. Вызов ConfigureContainerв подсвойстве Host
  3. Заявите о своих услугах и сроках их службы

Вариант 1 для ручного объявления сервисов. Вариант 2 — пример сканирования сборок «API отражения».

      var builder = WebApplication.CreateBuilder(args);

// Call UseServiceProviderFactory on the Host sub property 
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());

// Call ConfigureContainer on the Host sub property 
builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
{
   // Declare your services with proper lifetime
  // Option 1 declaring services manually

    builder.RegisterType<AppLogger>().As<IAppLogger>().SingleInstance();
    builder.RegisterType<DataAccess>().As<IDataAccess>().InstancePerLifetimeScope();

  // Option 2 is an example of Assembly scanning "reflection API"
  builder.RegisterAssemblyTypes(Assembly.Load(nameof(DemoLibrary))).Where(t => t.Namespace?.Contains("Practicing.Services") == true)
    .As(t => t.GetInterfaces().FirstOrDefault(i => i.Name == "I" + t.Name));

});

Вы можете добавить все типы с помощью этого.

      builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());

var assembly = System.Reflection.Assembly.GetExecutingAssembly();

builder.Host.ConfigureContainer<ContainerBuilder>(builder => builder.RegisterAssemblyModules(assembly));
Другие вопросы по тегам