Ò»¡¢ÒÀÀµ×¢Èë¼ò½é
˵µ½ÒÀÀµ×¢È루Dependency Injection£¬ÒÔϼò³ÆDI£©£¬¾Í±ØÐë˵IoC£¨Inverse
of Control£©£¬ºÜ¶àÈ˽«ÕâÁ½Õâ»ìΪһ̸£¬ÆäʵÕâÊÇÁ½¸öÍêÈ«²»Í¬µÄ¸ÅÄ»òÕßÊDz»Í¬¡°²ã´Î¡±µÄÁ½¸ö¸ÅÄÎÒÔøÔÚ¡¶¿ØÖÆ·´×ª£¨IoC£©¡·ºÍ¡¶ÒÀÀµ×¢È루DI£©¡·¶ÔÕâÁ½¸ö¸ÅÄî×ö¹ýÏêϸ½éÉÜ¡£ASP.NET
CoreʹÓõÄDI¿ò¼ÜÓÉ¡°Micorosoft.Extensions.DependencyInjection¡±Õâ¸öNuGet°üÀ´³ÐÔØ£¬ÎÒÃÇÒ²¿ÉÒÔ·ÇASP.NET
CoreÓ¦ÓûòÕßÄã×Ô¼ºµÄ¿ò¼ÜÉϵ¥¶ÀʹÓÃËü£¬¶ÔÓÚÕâ¸öDI¿ò¼ÜµÄÉè¼Æ¡¢ÊµÏÖÒÔ¼°±à³ÌÏà¹ØµÄÄÚÈÝ£¬ÎÒÔÚϵÁÐÎÄÕ¡¶ASP.NET
Core ÖеÄÒÀÀµ×¢Èë [¹²7ƪ]¡·¶Ô´ËÓйýÏêϸµÄ½éÉÜ¡£
DI¿ò¼Ü¾ßÓÐÁ½¸öºËÐĵŦÄÜ£¬¼´·þÎñµÄ×¢²áºÍÌṩ£¬ÕâÁ½¸ö¹¦ÄÜ·Ö±ðÓɶÔÓ¦µÄ¶ÔÏóÀ´³ÐÔØ, ËüÃÇ·Ö±ðÊÇServiceCollectionºÍServiceProvider¡£ÈçÏÂͼËùʾ£¬ÎÒÃǽ«ÏàÓ¦µÄ·þÎñÒÔ²»Í¬µÄÉúÃüÖÜÆÚģʽ£¨Transient¡¢ScopedºÍSingleton£©×¢²áµ½ServiceCollection¶ÔÏóÖ®ÉÏ£¬ÔÚÀûÓúóÕß´´½¨µÄServiceProvider¸ù¾Ý×¢²áµÄ·þÎñÀàÐÍÌáÈ¡ÏàÓ¦µÄ·þÎñ¶ÔÏó¡£

¶þ¡¢ÒÀÀµ×¢ÈëÔڹܵÀ¹¹½¨¹ý³ÌÖеÄʹÓÃ
ÔÚASP.NET Core¹ÜµÀµÄ¹¹¼Ü¹ý³ÌÖÐÖ÷񻃾¼°Èý¸ö¶ÔÏó/ÀàÐÍ£¬×÷ΪËÞÖ÷µÄWebHostºÍËûµÄ´´½¨ÕßWebHostBuilder£¬ÒÔ¼°×¢²áµ½WebHostBuilderµÄStartupÀàÐÍ¡£
ÈçϵĴúÂëÆ¬¶ÎÌåÏÖÁËÆô¶¯ASP.NET CoreÓ¦ÓòÉÓõĵäÐͱà³Ìģʽ£ºÎÒÃÇÊ×ÏÈ´´½¨Ò»¸öWebHostBuilder¶ÔÏ󣬲¢½«²ÉÓÃServerºÍStartupÀàÐÍ×¢²áµ½ËüÖ®ÉÏ¡£ÔÚµ÷ÓÃBuild·½·¨´´½¨WebHost֮ǰ£¬ÎÒÃÇ»¹¿ÉÒÔµ÷ÓÃÏàÓ¦µÄ·½Ê½×öÆäËûËùÐèµÄ×¢²á¹¤×÷¡£µ±ÎÒÃǵ÷ÓÃWebHostµÄRun·½·¨Ö®ºó£¬ºóÕß»áÀûÓÃ×¢²áµÄStartupÀàÐÍÀ´¹¹½¨ÍêÕûµÄ¹ÜµÀ¡£ÄÇôÔڹܵÀµÄ¹¹½¨¹ý³ÌÖУ¬DIÊÇÈçºÎ±»Ó¦ÓõÄÄØ£¿
1:new WebHostBuilder() 2: .UseKestrel() 3: .UseStartup<Startup>() 4: .Xxx 5: .Build() 6: .Run()
|
DIÔڹܵÀASP.NET Core¹ÜµÀ¹¹½¨¹ý³ÌÖеÄÓ¦Óûù±¾ÌåÏÖÏÂÃæÕâ¸öÐòÁÐͼÖС£µ±ÎÒÃǵ÷ÓÃWebHostBuilderµÄBuild·½·¨´´½¨¶ÔÓ¦µÄWebHostµÄʱºò£¬Ç°Õ߻ᴴ½¨Ò»¸öServiceCollection¶ÔÏ󣬲¢½«Ò»ÏµÁÐÔ¤¶¨ÒåµÄ·þÎñ×¢²áÔÚËüÖ®ÉÏ¡£½ÓÏÂÀ´WebHostBuilder»áÀûÓÃÕâ¸öServiceCollection¶ÔÏó´´½¨³ö¶ÔÓ¦µÄServieProvider£¬Õâ¸öServiceProviderºÍServiceCollection¶ÔÏó»áÒ»²¢´«µÝ¸ø×îÖÕ´´½¨WebHost¶ÔÏó¡£µ±ÎÒÃǵ÷ÓÃWebHostµÄRun·½·¨Æô¶¯ËüµÄʱºò£¬Èç¹û×¢²áµÄStartupÊÇÒ»¸öʵÀýÀàÐÍ£¬Ëü»áÀûÓÃÕâ¸öServiceProviderÒÔ¹¹ÔìÆ÷×¢ÈëµÄ·½Ê½´´½¨¶ÔÓ¦µÄStartup¶ÔÏó¡£ËµµÄ¾ßÌåÒ»µã£¬ÎÒÃÇ×¢²áµÄStartupÀàÐ͵Ĺ¹Ô캯ÊýÊÇÔÊÐí¶¨Òå²ÎÊýµÄ£¬µ«ÊDzÎÊýÀàÐͱØÐëÊÇÔ¤ÏÈ×¢²áµ½ServiceCollectionÖеķþÎñÀàÐÍ¡£

×¢²áµÄStartup·½·¨¿ÉÒÔ°üº¬Ò»¸ö¿ÉÑ¡µÄConfigureServices·½·¨£¬Õâ¸ö·½·¨¾ßÓÐÒ»¸öÀàÐÍΪIServiceCollection½Ó¿ÚµÄ²ÎÊý¡£WebHost»á½«WebHostBuilder´«µÝ¸øËüµÄServiceCollection×÷Ϊ²ÎÊýµ÷ÓÃÕâ¸öConfigureServices·½·¨£¬¶øÎÒÃÇÔòÀûÓÃÕâ¸ö·½·¨½«×¢²áµÄÖмä¼þºÍÓ¦ÓÃËùÐèµÄ·þÎñ×¢²áµ½Õâ¸öServiceCollection¶ÔÏóÉÏ¡£ÔÚÕâÖ®ºó£¬ËùÓÐÐèÒªµÄ·þÎñ£¨°üÀ¨¿ò¼ÜºÍÓ¦ÓÃ×¢²áµÄ·þÎñ£©¶¼×¢²áµ½Õâ¸öServiceCollectionÉÏÃæ£¬WebHost»áÀûÓÃËü´´½¨Ò»¸öеÄServiceProvider¡£WebHost»áÀûÓÃÕâ¸öServiceProvider¶ÔÏóÒÔ·½·¨×¢ÈëµÄ·½Ê½µ÷ÓÃStartup¶ÔÏó/ÀàÐ͵ÄConfigure·½·¨£¬×îÖÕÍê³ÉÄã¶ÔÕû¸ö¹ÜµÀµÄ½¨Á¢¡£»»¾ä»°»á˵£¬¶¨ÒåÔÚStartupÀàÐÍÖÐÖ¼ÔÚÓÃÓÚ×¢²áMiddlewareµÄConfigure·½·¨³ýÁ˲ÉÓÃIApplicationBuilder×÷ΪµÚÒ»¸ö²ÎÊýÖ®Í⣬ËüÒÀÈ»¿ÉÒÔ²ÉÓÃ×¢²áµÄÈκÎÒ»¸ö·þÎñÀàÐÍ×÷ΪºóÐø²ÎÊýµÄÀàÐÍ¡£
·þÎñµÄ×¢²á³ýÁËÊÇÏÖÔÚ×¢²áµÄStartupÀàÐ͵ÄConfigureServices·½·¨Ö®Í⣬ʵ¼ÊÉÏ»¹¾ßÓÐÁíÒ»¸öʵÏÖ·½Ê½£¬ÄǾÍÊǵ÷ÓÃWebHostBuilder¾ßÓÐÈç϶¨ÒåµÄConfigureServices·½·¨¡£µ±WebHostBuilder´´½¨³öServiceCollection¶ÔÏó²¢Íê³ÉÁËĬÈÏ·þÎñµÄ×¢²áºó£¬ÎÒÃÇͨ¹ýµ÷ÓÃÕâ¸ö·½·¨Ëù´«ÈëµÄËùÓÐAction<IServiceCollection>¶ÔÏó½«×îÖÕÓ¦Óõ½Õâ¸öServiceCollection¶ÔÏóÉÏ¡£
1: public interface IWebHostBuilder 2: { 3: IWebHostBuilder ConfigureServiecs(Action<IServiceCollection> configureServices); 4: }
|
ÖµµÃÒ»ÌáµÄÊÇ£¬StartupÀàÐ͵ÄConfigureServices·½·¨ÊÇÔÊÐí¾ßÓÐÒ»¸öIServiceProviderÀàÐ͵ķµ»ØÖµ£¬Èç¹ûÕâ¸ö·½·¨·µ»ØÒ»¸ö¾ßÌåµÄServiceProrivder£¬ÄÇôWebHost½«²»»áÀûÓÃServiceCollectionÀ´´´½¨ServiceProvider£¬¶øÊÇÖ±½ÓʹÓÃÕâ¸ö·µ»ØµÄServiceProviderÀ´µ÷ÓÃStartup¶ÔÏó/ÀàÐ͵ÄConfigure·½·¨¡£Õâʵ¼ÊÉÏÊÇÒ»¸öºÜÓÐÓõÄÀ©Õ¹µã£¬ÎÒÃÇʹÓÃËü¿ÉÒÔʵÏÖÕë¶ÔÆäËüDI¿ò¼ÜµÄ¼¯³É¡£
Èý¡¢ÒÀÀµ·þÎñµÄ×¢²áÓë×¢Èë
½ÓÏÂÀ´ÎÒÃÇͨ¹ýÒ»¸öʵÀýÀ´ÑÝʾÈçºÎÀûÓÃStartupÀàÐ͵ÄConfigureServicesÀ´×¢²á·þÎñ£¬ÒÔ¼°·¢ÉúÔÚStartupÀàÐÍÉϵÄÁ½ÖÖÒÀÀµ×¢ÈëÐÎʽ¡£ÈçÏÂÃæµÄ´úÂëÆ¬¶ÎËùʾ£¬ÎÒÃǶ¨ÒåÁËÁ½¸ö·þÎñ½Ó¿Ú£¨IFooºÍIBar£©ºÍ¶ÔÓ¦µÄʵÏÖÀàÐÍ£¨FooºÍBar£©¡£ÆäÖÐÆäÖзþÎñFooÊÇͨ¹ýµ÷ÓÃWebHostBuilderµÄConfigureServices·½·¨½øÐÐ×¢²áµÄ£¬¶øÁíÒ»¸ö·þÎñBarµÄ×¢²áÔò·¢ÉúÔÚStartupµÄConfigureServices·½·¨ÉÏ¡£¶ÔÓÚStartupÀ´Ëµ£¬Ëü¾ßÓÐÒ»¸öÀàÐÍΪIFooµÄÖ»¶ÁÊôÐÔ£¬¸ÃÊôÐÔÔÚ¹¹Ô캯ÊýÀûÓô«ÈëµÄ²ÎÊý½øÐгõʼ»¯£¬²»ÓÃ˵ÕâÌåÏÖÁËÕë¶ÔStartupµÄ¹¹ÔìÆ÷×¢Èë¡£StartupµÄConfigure·½·¨³ýÁËApplicationBuilder×÷ΪµÚÒ»¸ö²ÎÊýÖ®Í⣬»¹¾ßÓÐÁíÒ»¸öÀàÐÍΪIBarµÄ²ÎÊý£¬ÎÒÃÇÀûÓÃËüÀ´ÑÝʾ·½·¨×¢Èë¡£
1: public interface IFoo { } 2: public interface IBar { } 3: public class Foo : IFoo { } 4: public class Bar : IBar { } 5: 6: public class Program 7: { 8: public static void Main(string[] args) 9: { 10: new WebHostBuilder() 11: .ConfigureServices(services=>services.AddSingleton<IFoo, Foo>()) 12: .UseKestrel() 13: .UseStartup<Startup>() 14: .Build() 15: .Run(); 16: } 17: } 18: public class Startup 19: { 20: public IFoo Foo { get; private set; } 21: public Startup(IFoo foo) 22: { 23: this.Foo = foo; 24: } 25: public void ConfigureServices(IServiceCollection services) 26: { 27: services.AddTransient<IBar, Bar>(); 28: } 29: 30: public void Configure(IApplicationBuilder app, IBar bar) 31: { 32: app.Run(async context => 33: { 34: context.Response.ContentType = "text/html"; 35: await context.Response.WriteAsync($"IFoo=>{this.Foo}<br/>"); 36: await context.Response.WriteAsync($"IBar=>{bar}"); 37: }); 38: } 39: }
|
ÔÚStartupµÄConfigure·½·¨ÖУ¬ÎÒÃǵ÷ÓÃApplicationBulderµÄRun·½·¨×¢²áÁËÒ»¸öMiddleware£¬ºóÕß½«Á½¸ö×¢ÈëµÄ·þÎñµÄÀàÐÍ×÷ΪÏìÓ¦µÄÄÚÈÝ¡£µ±ÎÒÃÇÔËÐÐÕâ¸öÓ¦Ó㬲¢ÀûÓÃä¯ÀÀÆ÷·ÃÎÊĬÈϵļàÌýµØÖ·£¨http://localhost:5000£©Ê±£¬ä¯ÀÀÆ÷»á½«×¢ÈëµÄÁ½¸ö·þÎñ¶ÔÏóµÄÀàÐÍÒÔÏÂͼµÄ·½Ê½Õ¹ÏÖ³öÀ´¡£

ËÄ¡¢ÈÃStartupµÄConfigureServices·½·¨·µ»ØÒ»¸öServiceProvider
ÎÒÃÇ˵ע²áµÄStartupÀàÐ͵ÄConfigureServicesÔÊÐí·µ»ØÒ»¸öServiceProvider£¬Õâ¸öÌØÐÔµÄÖØÒªÒâÒåÔÚÓÚËüʹÎÒÃÇ¿ÉÒÔʵÏÖÓëµÚÈý·½DI¿ò¼Ü£¨±ÈÈçUnity¡¢Castle¡¢NinjectºÍAutoFacµÈ£©µÄ¼¯³É¡£ÎÒÃÇÕÕÀý²ÉÓÃÒ»¸öʵÀý¶Ô´Ë×öÒ»¸öÑÝʾ£¬¼òµ¥Æð¼û£¬ÎÒÃDz¢²»»áÕæÕýÀûÓÃij¸ö¾ßÌåµÄDI¿ò¼ÜÀ´´´½¨Õâ¸öServiceProvider£¬¶øÊÇÖ±½Ó´´½¨Ò»¸öеÄServiceCollectionÀ´´´½¨Ëü,Ϊ´ËÎÒÃǶÔÉÏÃæÕâ¸ö³ÌÐò½øÐÐÁËÈçϵĸÄд¡£
1: public class Program 2: { 3: public static void Main(string[] args) 4: { 5: new WebHostBuilder() 6: .UseKestrel() 7: .UseStartup<Startup>() 8: .Build() 9: .Run(); 10: } 11: } 12: public class Startup 13: { 14: public IServiceProvider ConfigureServices(IServiceCollection services) 15: { 16: IServiceCollection newServices = new ServiceCollection(); 17: foreach (ServiceDescriptor service in services) 18: { 19: newServices.Add(service); 20: } 21: 22: return newServices 23: .AddSingleton<IFoo, Foo>() 24: .AddSingleton<IBar, Bar>() 25: .BuildServiceProvider(); 26: } 27: 28: public void Configure(IApplicationBuilder app, IFoo foo, IBar bar) 29: { 30: app.Run(async context => 31: { 32: context.Response.ContentType = "text/html"; 33: await context.Response.WriteAsync($"IFoo=>{foo}<br/>"); 34: await context.Response.WriteAsync($"IBar=>{bar}"); 35: }); 36: } 37: }
|
ÈçÉÏÃæµÄ´úÂëÆ¬¶ÎËùʾ£¬ÔÚStartupµÄConfigureServices·½·¨ÖУ¬ÎÒÃÇͨ¹ý¿½±´×¢²áµ½ÏÖÓÐServiceCollectionµÄËùÓÐServiceDescriptorÉú³ÉÁËÒ»¸öеÄServiceCollection£¬Á½¸ö·þÎñFooºÍBar±»×¢²áµ½ºóÕßÖ®ÉÏ¡£¸Ã·½·¨×îÖÕ·µ»ØÓÉÕâ¸öÐÂServiceCollection´´½¨µÄServiceProvider¡£ÔÚÁíÒ»¸öConfigure·½·¨ÖУ¬ÎÒÃÇÌí¼ÓÁËÁ½¸öÀàÐÍ·Ö±ðΪIFooºÍIBarµÄ²ÎÊý£¬²¢ÒÔÏàͬµÄ·½Ê½½«ËüÃǵÄÕæÊµÀàÐÍÃû³ÆºÍ×¢²á·þÎñÀàÐ͵ÄÓ³Éä¹ØÏµ×÷ΪÏìÓ¦ÄÚÈÝ¡£³ÌÐòÔËÐÐÖ®ºó£¬ÎÒÃÇÀûÓÃä¯ÀÀÆ÷½øÐзÃÎÊÕÕÑù»áµÃµ½Ò»ÑùµÄ½á¹û¡£
Îå¡¢ASP.NET CoreĬÈÏ×¢²áÁËÄÄЩ·þÎñ
WebHostBuilderÔÚ´´½¨ServiceCollectionÖ®ºó£¬»á×¢²áһЩĬÈϵķþÎñ¡£ÕâЩ·þÎñºÍÎÒÃÇ×ÔÐÐ×¢²áµÄ·þÎñ²¢Ã»ÓÐÈκÎÇø±ð£¬Ö»ÒªÎÒÃÇÖªµÀ¶ÔÓ¦µÄ·þÎñÀàÐÍ£¬¾Í¿ÉÒÔͨ¹ý×¢ÈëµÄ·½Ê½»ñÈ¡²¢Ê¹ÓÃËüÃÇ¡£ÄÇô¾ßÌåÓÉÄÄЩ·þÎñ±»Ä¬ÈÏ×¢²áÁËÄØ£¿ÈçÏÂËùʾµÄÊÇÕâЩ·þÎñ¶ÔÓ¦µÄÀàÐÍ£¬ÖÁÓÚÕâЩ·þÎñ¸÷×ÔÓкÎÓÃ;£¬ÎÒÃÇÔÚÕâÀï¾ÍÏȲ»ÉÁË¡£
IHostingEnvironment
ILoggerFactory
ILogger<>
IApplicationBuilderFactory
IHttpContextFactory
IOptions<>
DiagnosticSource
DiagnosticListener
IStartupFilter
ObjectPoolProvider
>IStartup
Èç¹ûÎÒÃÇÐèÒªÕâЩԤע²áµÄ·þÎñ£¬ÎÒÃÇ¿ÉÒÔ°´ÕÕÎÒÃÇÊìϤµÄ·½Ê½ÒÔÒÀÀµ×¢ÈëµÄ·½Ê½À´Ê¹ÓÃËüÃÇ¡£ÈçÏÂÃæµÄ´úÂëÆ¬¶ÎËùʾ£¬ÎÒÃÇÔÚStartupµÄConfigure·½·¨ÖÐÖ±½Ó²ÉÓ÷½·¨×¢ÈëµÄ·½Ê½À´Ê¹ÓÃÕâЩԤ¶¨ÒåµÄ·þÎñ¡£
1: public class Program 2: { 3: public static void Main(string[] args) 4: { 5: new WebHostBuilder() 6: .UseKestrel() 7: .UseStartup<Startup>() 8: .Build() 9: .Run(); 10: } 11: } 12: public class Startup 13: { 14: public void Configure( 15: IApplicationBuilder app, 16: IHostingEnvironment environment, 17: ILoggerFactory loggerFactory, 18: IHttpContextFactory httpContextFactory, 19: DiagnosticSource diagnosticSource, 20: DiagnosticListener diagnosticListener) 21: { 22: app.Run(async context => 23: { 24: context.Response.ContentType = "text/html"; 25: await context.Response.WriteAsync ($"IApplicationBuilder=>{app}<br/>"); 26: await context.Response.WriteAsync ($"IHostingEnvironment=>{environment}<br/>"); 27: await context.Response.WriteAsync ($"ILoggerFactory=>{loggerFactory}<br/>"); 28: await context.Response.WriteAsync ($"IHttpContextFactory=>{httpContextFactory}<br/>"); 29: await context.Response.WriteAsync ($"DiagnosticSource=>{diagnosticSource}<br/>"); 30: await context.Response.WriteAsync ($"DiagnosticListener=>{diagnosticListener}"); 31: }); 32: } 33: }
|
ÓÉÓÚConfigure·½·¨×¢²áµÄMiddlewareÖ±½Ó½«×¢Èë·þÎñµÄ×¢²áÀàÐͺÍÕæÊµÀàÐ͵ÄÓ³Éä¹ØÏµ×÷ΪÏìÓ¦ÄÚÈÝ£¬ËùÒÔÎÒÃÇ·ÃÎÊÓ¦ÓûáµÄµÃµ½ÈçÏÂËùʾµÄÊä³ö½á¹û¡£

Áù¡¢ASP.NET Core MVCÖеÄÒÀÀµ×¢Èë
¶ÔÓÚASP.NET MVC 5»úÆ÷ÒÔ¼°Ö®Ç°µÄ°æ±¾£¬ÔÚĬÈÏÇé¿ö϶¨ÒåµÄController¶¼¾ßÓÐÒ»¸öÒªÇó£¬ÄǾÍÊÇControllerÀàÐͱØÐë¾ßÓÐÒ»¸öÎÞ²ÎÊýµÄĬÈϹ¹Ô캯Êý£¬·ñÔòControllerʵÀý½«ÎÞ·¨¼¤»î¡£¶ÔÓÚ×ÔÉí¾ßÓÐÒÀÀµ×¢È빦ÄܵÄASP.NET
Core MVCÀ´Ëµ£¬¶¨ÒåController½«Ã»ÓÐÁËÕâ¸öÏÞÖÆ¡£¶ÔÓÚԤע²áµÄ·þÎñ£¬ÎÒÃÇÍêÈ«¿ÉÒÔ²ÉÓù¹ÔìÆ÷×¢ÈëµÄ·½Ê½ÔÚ¶¨ÒåµÄControllerÖÐʹÓÃËüÃÇ¡£×÷ΪÑÝʾ£¬ÎÒÃǶÔÉÏÃæÕâ¸öÓ¦ÓÃ×÷ÁËÈçϵĸÄд¡£
1: public class Program 2: { 3: public static void Main(string[] args) 4: { 5: new WebHostBuilder() 6: .UseKestrel() 7: .ConfigureServices(services=>services 8: .AddSingleton<IFoo,Foo>() 9: .AddSingleton<IBar,Bar>() 10: .AddMvc()) 11: .Configure(app=>app.UseMvc()) 12: .Build() 13: .Run(); 14: } 15: } 16: 17: public class HomeController 18: { 19: public IFoo Foo { get; private set; } 20: public IBar Bar { get; private set; } 21: 22: public HomeController(IFoo foo, IBar bar) 23: { 24: this.Foo = foo; 25: this.Bar = bar; 26: } 27: 28: [HttpGet("/")] 29: public string Index() 30: { 31: this.HttpContext.Response.ContentType = "text/html"; 32: return $"IFoo=>{this.Foo}<br/>IBar=>{this.Bar}"; 33: } 34: }
|
ÉÏÃæÕâ¸ö´úÂëÓë֮ǰÓÐÒ»¸öÏÔÖøµÄÇø±ð£¬ÄǾÍÊÇÎÒÃǸù±¾¾ÍûÓж¨ÒåStartupÀàÐÍ£¬ÎÒÃǽ«Ô±¾ÊµÏÖÔÚËüµÄÁ½¸ö·½·¨£¨ConfigureServicesºÍConfigure£©ÖеŦÄÜÒÆÖ²µ½ÁËWebHostBuilderµÄͬÃû·½·¨ÖУ¬ÕâÁ½ÖÖÐÎʽµÄ±à³Ì·½Ê½ÆäʵÊǵÈЧµÄ¡£ÔÚµ÷ÓÃConfigureServices·½·¨µÄʱºò£¬ÎÒÃdzýÁË×¢²áMVCÏà¹ØµÄ·þÎñÖ®Í⣬FooºÍBarÕâÁ½¸ö·þÎñÒ²Ò»²¢½øÐÐÁË×¢²á¡£ÖÁÓÚÁíÒ»¸öConfigure·½·¨£¬ÎÒÃÇÖ±½Óµ÷ÓÃÆäÀ©Õ¹·½·¨MVC×¢²áÓëMVCÏà¹ØµÄMiddleware¡£
ÎÒÃǶ¨ÒåÁËÒ»¸öĬÈϵÄHomeController£¬Ëü¾ßÓÐÁ½¸öÀàÐÍ·Ö±ðΪIFooºÍIBarµÄÖ»¶ÁÊôÐÔ£¬ºóÕßÔÚ¹¹Ô캯ÊýÓÉ´«ÈëµÄ²ÎÊý½øÐгõʼ»¯£¬ÎÒÃÇÖªµÀÕâÊǹ¹ÔìÆ÷×¢ÈëµÄ±à³Ì·½Ê½¡£ÔÚAction·½·¨IndexÖÐ
£¬ÎÒÃÇÒÀÈ»½«ÕâÁ½¸ö·þÎñµÄ×¢²áÀàÐͺÍÕæÊµÀàÐÍÖ®¼äµÄÆ¥Åä¹ØÏµ×÷ΪÏìÓ¦ÄÚÈÝ£¬ËùÒÔÎÒÃÇ·ÃÎÊÕâ¸öÓ¦ÓÃÒÀÈ»»áµÃµ½ÈçÏÂËùʾµÄÊä³ö½á¹û¡£

|