Pull to refresh

Comments 6

Спасибо за пост! Интересно было почитать про нововведения .NET 6, например что нет класса Startup, все в одном файле.

Вот то, что класс Startup не нужен (точнее, из шаблона по умолчанию его убрали) — это, по сути, ни разу не нововведение.
И раньше вполне можно было вместо него использовать сам класс 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 уже не поддерживается.
Sign up to leave a comment.

Articles