В настоящее время я создаю серверное приложение, которое говорит по собственному протоколу через TCP. Это серверное приложение в настоящее время использует Autofac для внедрения зависимостей.
Однако недавно я добавил в решение проект ASP.NET Core, чтобы предоставить HTTP API для работы с серверным приложением, главным образом для обеспечения веб-приложения управления.
Autofac обеспечивает интеграцию для проектов ASP.NET Core, но мне трудно понять, как я могу указать конфигурации службы ASP.NET Core использовать уже созданный контейнер службы Autofac, чтобы мой TCP служил и HTTP API может разрешать службы из одного контейнера.
Autofac предоставляет документацию для этого:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// Add services to the collection.
services.AddMvc();
// Create the container builder.
var builder = new ContainerBuilder();
builder.Populate(services);
builder.RegisterType<MyType>().As<IMyType>();
this.ApplicationContainer = builder.Build();
// Create the IServiceProvider based on the container.
return new AutofacServiceProvider(this.ApplicationContainer);
// ^
// This is where I'd like to insert my container ━━━━┛
}
В этом примере показано только, как создать полный контейнер с нуля для приложения ASP.NET Core, а теперь как повторно использовать существующий контейнер.
Использование метода ConfigureServices
в IWebHostBuilder
здесь не работает, потому что он имеет тип возврата void
, поэтому я не могу вернуть AutofacServiceProvider
там.
Вот как я запускаю свое приложение:
var containerBuilder = new ContainerBuilder();
// Here's where I register all my services
containerBuilder.RegisterModule(new ApplicationModule());
var container = containerBuilder.Build();
using (var scope = container.BeginLifetimeScope())
{
var server = scope.Resolve<TcpServer>();
var isService = args.Contains("--winservice");
// Construct the HTTP API
var builder = WebHost
.CreateDefaultBuilder(args.Where(arg => arg != "--winservice").ToArray())
.ConfigureServices(collection =>
{
// Not sure what to do here?
// I can call `collection.AddAutofac` here, not sure what that does
})
.UseStartup<ApplicationAPI>();
// Start the HTTP API
if (isService)
{
// Run as a Win Service
builder.Build().RunAsCustomService(server);
}
else
{
await server.Start();
// Do not run as a Win Service
builder.Build().Run();
}
}
Так как я могу использовать один и тот же контейнер для разрешения зависимостей как на моем TCP-сервере, так и на HTTP API?
Спасибо!