您的位置:68399皇家赌场 > 集群主机 > 学学ASP.NET Core, 怎能不打听诉求管理管道[4]: 应用

学学ASP.NET Core, 怎能不打听诉求管理管道[4]: 应用

发布时间:2019-09-23 00:47编辑:集群主机浏览(154)

    概念本人命名的Startup类

    皇家赌场,StartupMethods对象的创办

    除开,对于定义成实例类型的开发银行类,大家并不须求它富有三个默许无参的构造函数。要是构造函数具有参数,ConventionBasedStartup在实例化的时候会选用构造函数注入的不二秘技来提供构造函数的参数。至于提供参数所用的ServiceProvider,便是WebHostBuilder在创建WebHost对象时作为构造函数参数提供的不胜ServiceProvider。如上面包车型大巴代码片段所示,我们应用WebHostBuilder创造并运行WebHost从前,调用他的ConfigureServices方法针对接口IFoobar注册了贰个劳务,那么注册为运转类的Startup类能够在构造函数中以注入的花样利用那些服务对象。

       1: public class StartupLoader
    
       2: {
    
       3:     public static StartupMethods LoadMethods(IServiceProvider serviceProvider, Type startupType, string environmentName)
    
       4:     {
    
       5:         return new StartupMethods(BuildConfigureDelegate(serviceProvider, startupType, environmentName), 
    
       6:             BuildConfigureServicesDelegate(serviceProvider, startupType,   environmentName));
    
       7:     }
    
       8:  
    
       9:     private static Func<IServiceCollection, IServiceProvider> BuildConfigureServicesDelegate(IServiceProvider serviceProvider, Type startupType, string environmentName)
    
      10:     {
    
      11:         MethodInfo method = FindMethod(startupType, $"Configure{environmentName}Services", "ConfigureServices");        
    
      12:         object instance = method.IsStatic ? null : ActivatorUtilities.GetServiceOrCreateInstance(serviceProvider, startupType);        
    
      13:         return services =>
    
      14:         {
    
      15:             object[] arguments = method.GetParameters().Length > 0 ? new object[] { services } : new object[0];
    
      16:             return (method.Invoke(instance, arguments) as IServiceProvider) ?? services.BuildServiceProvider();
    
      17:         };
    
      18:     }
    
      19:  
    
      20:     private static Action<IApplicationBuilder> BuildConfigureDelegate(IServiceProvider serviceProvider, Type startupType, string environmentName)
    
      21:     {
    
      22:         MethodInfo method = FindMethod(startupType, $"Configure{environmentName}", "Configure");        
    
      23:         object instance = method.IsStatic ? null : ActivatorUtilities.GetServiceOrCreateInstance(serviceProvider, startupType);        
    
      24:         object[] arguments = method.GetParameters().Select(p => serviceProvider.GetService(p.ParameterType)).ToArray();        
    
      25:         return app =>
    
      26:         {
    
      27:             arguments[0] = app;
    
      28:             method.Invoke(instance, arguments);
    
      29:         };
    
      30:     }
    
      31:  
    
      32:     private static MethodInfo FindMethod(Type startupType, string method1, string method2)
    
      33:     {    
    
      34:         BindingFlags bindAttribute = BindingFlags.Public | BindingFlags.Instance |    BindingFlags.Static;
    
      35:         return startupType.GetMethod(method1, bindAttribute)?? startupType.GetMethod(method2, bindAttribute);    
    
      36:      }
    
      37: }
    

    ASP.NET Core知多少类别:总体介绍及目录

    StartupMethods

    在打听了开发银行项指标预订以及宽广的概念格局之外,大家后天来谈谈那对那些类型创造的ConventionBasedStartup正是如何的对象。从上面的代码片段能够看出,三个ConventionBasedStartup对象是依据三个体系为StartupMethods对象创制的。看名就能够知道意思,StartupMethods只在提供四个顾客注册服务和中间件的办法,那八个情势浮今后由它的五个属性(ConfigureServicesDelegate和ConfigureDelegate)提供的七个委托对象,那多少个委托对象分别完毕了定义在ConventionBasedStartup的ConfigureServices和Configure方法。

       1: public class ConventionBasedStartup : IStartup
    
       2: {
    
       3:     public ConventionBasedStartup(StartupMethods methods);
    
       4:     public IServiceProvider ConfigureServices(IServiceCollection services); 
    
       5:     public void Configure(IApplicationBuilder app);
    
       6: }
    
       7:  
    
       8: public class StartupMethods
    
       9: {      
    
      10:     public Func<IServiceCollection, IServiceProvider>     ConfigureServicesDelegate {  get; }
    
      11:     public Action<IApplicationBuilder>                    ConfigureDelegate {  get; }
    
      12:  
    
      13:     public StartupMethods(Action<IApplicationBuilder> configure);
    
      14:     public StartupMethods(Action<IApplicationBuilder> configure, Func<IServiceCollection, IServiceProvider> configureServices);   
    
      15: }
    

    2. 约定方法

    大家通晓运行类中关键蕴含了ConfigureServiceConfigure四个格局。

       1: public interface IStartup
    
       2: {
    
       3:     IServiceProvider ConfigureServices(IServiceCollection services);
    
       4:     void Configure(IApplicationBuilder app);
    
       5: }
    

    3. 可用服务

    从上节我们就曾经知道,ASP.NET Core在调用此前已经暗许注入了以下多少个可用服务:

    • IConfiguration:用于读取应用程序配置。
    • IServiceCollection:能够知晓为ASP.NET Core内置的依赖注入容器。
    • IApplicationBuilder:用于创设应用程序的呼吁管道。
    • IHostingEnvironment :提供了前段时间应用程序的运维的宿主遇到安排音信。

    除开,我们还足以选取已经注入的IServiceProviderILoggerFactoryILoggerIApplicationLifetime等可用服务。这么些预置服务能够注入到Startup类的构造函数或Configure方中。就像那样:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env,
          ILoggerFactory loggerFactory)
    {
          loggerFactory.AddDebug();
    }
    

    ConfigureServices只帮助一个参数IServiceCollection,因为全体的借助都足以透过IServiceCollection获得,所以并没有要求通过措施再流入其余服务,能够直接通过以下形式剖析正视的劳动:

    public void ConfigureServices(IServiceCollection services)
    {
        var serveiceProvider = services.BuildServiceProvider();
        var logger =serveiceProvider.GetService<ILogger>();
        //....
    }
    
    <add key="owin:appStartup" value="OwinConsoleApp.Startup1" />
    

    怎么样抉择服务注册格局和中间件注册方式

    在询问了ASP.NET Core针对运维项目命名的预约之后,大家来商量一下定义在运营类中用来注册服务和中间件的三个艺术的预订。那四个格局能够是静态方法,也能够是实例方法。从章程命名来看,这多少个办法除了命名称为“ConfigureServices”和“Configure”之外,方法名还能指引运转条件名称,具体运用的格式分别为“Configure{EnvironmentName}Services”和“Configure{EnvironmentName}”,后面一个有着更加高的挑选优先级。

    ConfigureServices/Configure{EnvironmentName}Services方法具备三个项目为IServiceCollection接口的参数,表示存放注册服务的ServiceCollection对象。如过这几个方法未有概念任何参数,它依然是合法的。一般的话,这么些点子不辜负有重返值(重临类型为void),然而它也得以定义成贰个回来类型为IServiceProvider的办法。假设那几个方法再次来到一个ServiceProvider对象,后续进度中赢得的全部服务将从这么些ServiceProvider中提取。对于从未再次来到值的图景,系统会依照前段时间登记的服务创制一个ServiceProvider。

    Configure/Configure{EnvironmentName}方法只需要只须要首先个参数类型应用IApplicationBuilder接口,至于这几个办法能够蕴含多少个参数,各种参数应该具有什么等的品类,并未有做别的规定。实际上大家为那一个方法定义任意后续参数都是合法的。当ConventionBasedStartup在调用那个办法的时候,同样是应用依赖注入的章程来提供这么些参数。如上面包车型客车代码片段所示,大家为运维类的Configure方法定义相应的参数来平昔动用在ConfigureServices方法上登记的多少个服务。

       1: new WebHostBuilder()
    
       2:     .ConfigureServices(services => services.AddSingleton<IFoobar, Foobar>())
    
       3:     …
    
       4:  
    
       5: public class Startup
    
       6: {
    
       7:     public Startup(IFoobar foobar)
    
       8:     {
    
       9:         Debug.Assert(foobar.GetType() == typeof(Foobar));
    
      10:     }
    
      11:     public void ConfigureServies(IServiceCollection services) ;
    
      12:     public void Configure(IApplicationBuilder app) ;
    
      13: }
    

    1.引言

    运维类暗中同意命名叫Startup,它是在前后相继入口函数中为了组织IWebHost时通过UseStartup<Startup>()点名的。主假设概念了八个主意ConfigureServiceConfigure办法。应用程序运转时依照UseStartup艺术钦定的Startup类或程序集,借助StartupLoader进行反射调用,以成功正视服务登记和中间件注册,以协会完整的HTTP恳求管道。

    上面大家就重组MVC模板项目中的Startup类来探究下其大约用法。

    1. 取名约定

      Katana在前后相继集内的次第集名称空间下搜索二个称作Startup的类,

    2. 通过质量钦赐

      [assembly: OwinStartup(typeof(OwinConsoleApp.Startup))]
      
    3. 通过配备文件

    目录

    一、 DelegateStartup
    二、ConventionBasedStartup
        StartupMethods
        StartupLoader
        怎么着挑选运行项目
        怎么着选用服务登记格局和中间件注册情势
        StartupMethods对象的始建
        UseStartup方法毕竟做了些什么?
    三、选拔哪二个Startup

    2.1. ConfigureService

    该格局一般用于配置服务将服务登记到依赖注入容器中,在Configure主意以前被调用。通过调用IServiceCollection的扩张方法进行劳动登记。扩大方法的命名建议根据Add[MethodName]拓宽预订,举个例子Mvc相关服务的登记services.AddMvc()

    除了,我们还足以在此措施中替换ASP.NET Core暗许内置的借助注入框架。譬喻大家应用Castle 温泽替换:

    1. 安装Castle.Windsor.MsDependencyInjection NuGet包;
    2. 修改章程重回值类型为IServiceProvider
    3. 轮换依赖容器:
    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    
        //Add Castle Windsor DI
        var ioContainer = new WindsorContainer();
    
        return WindsorRegistrationHelper.CreateServiceProvider(ioContainer, services);
    }
    

    本文由68399皇家赌场发布于集群主机,转载请注明出处:学学ASP.NET Core, 怎能不打听诉求管理管道[4]: 应用

    关键词: [01] .NET技术 定义 OWIN Class

上一篇:iOS 关于UILabel文本的自适应

下一篇:没有了