Комментарии 6
Спасибо за пост! Интересно было почитать про нововведения .NET 6, например что нет класса Startup, все в одном файле.
Вот то, что класс Startup не нужен (точнее, из шаблона по умолчанию его убрали) — это, по сути, ни разу не нововведение.
И раньше вполне можно было вместо него использовать сам класс Program — просто перенести в него из Startup.cs методы ConfigureServices и Configure и указать его имя вместо Startup в вызове UseStartup для IWebHostBuilder (а Startup.cs вообще выкинуть).
Примерно так (шаблон Generic Host, в Program.cs нужно еще добавить несколько using):
И раньше вполне можно было вместо него использовать сам класс Program — просто перенести в него из Startup.cs методы ConfigureServices и Configure и указать его имя вместо Startup в вызове UseStartup для IWebHostBuilder (а Startup.cs вообще выкинуть).
Примерно так (шаблон Generic Host, в Program.cs нужно еще добавить несколько using):
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Program>();
});
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Hello World! (from Program.cs)");
});
});
}
}
Я правильно понял, что проблема WebApplicationBuilder - это отсутствие возможности проброса DI в конструктор промежуточного ПО ?
Почему же, всё возможно.
Никакой проблемы. У класса WebApplicationBuilder есть свойство Host, которое, вопреки своему названию, дает доступ не к IHost или его реализации, а к реализующему интерфейс IHostBuilder классу ConfigureHostBuilder. Так что метод(точнее методы — их два перегруженных) UseServiceProviderFactory для подключения стороннего контейнера вполне доступен, равно как и метод ConfigureContainer для его конфигурирования.
Шаблоны по умолчанию также ссылаются на класс Startup. Этот класс не реализует интерфейс явно.
Ну, не совсем так. В шаблоне приложения Web Host (создания через IWebHostBuilder) можно использовать класс Startup, реализующий интерфейс IStartup, имеющий методы ConfigureServices и Configure. Но это, похоже, совсем седая древность, хоть и поддерживаемая — в шаблоне Generic Host (создание через IHostBuider) использование такого класса Startup уже не поддерживается.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Исследуем .NET 6. Часть 2. WebApplicationBuilder