nopCommerce_4.4功能实现详解-----第8章 为什么自定义和扩展.NetCore框架中的管道方法?

1、.NetCore框架中类实现的实例化操作的两种主要方式

 (1)、在相应类的拷贝构造方法通过指定类的接口或抽象声明的参数实例,赋值给该接口或抽象声明的类实例对一个/批指定类进行实例化/初始化操作。这种实例化方式的实例化操作的整个过程完全被.NetCore框架所封装,除了相应类的拷贝构造方法外,无任何实例化操作被暴露出来。

(2)、声明IServiceProvider接口的实例,调用该实例泛型方法GetRequiredService<T>()、GetService<T>(),通过对泛型使用接口或抽象指定对一个/批指定类进行实例化/初始化操作。这种实例化方式的实例化操作,暴露出来了一些.NetCore框架实现实例操作的类型及其实例方法。

注意:

上面两种实例化方式,必须先把需要被实例化的接口及其实现类,通过指定方法注入到依赖注入容器中,否则在程序执行时就会因无注入操作,直接使用类的实例而导致产生逻辑异常。在“nopCommerce”程序实现上,依赖注入容器主要包含:

(1)、.NetCore框架内置依赖注入容器—IserviceCollection。

(2)、“Autofac”第三方依赖注入容器。

两者各自有自己定义了一套独特的实现依赖注入操作的方法,两者在具体实现上的关系是“Autofac”第三方依赖注入容器,被.NetCore框架内置依赖注入容器所包含,即“Autofac”使用自己定义的依赖注入操作方法所注入的接口及其实现类,通过相应的操作也会被注入到.NetCore框架内置依赖注入容器中。

2、为什么现阶段必须自定义扩展.NetCore框架中的管道方法?

“nopCommerce”程序通过NopEngine类来自定义和扩展.NetCore框架所暴漏出来的两个方法。原本在Startup类两个同名方法中定义的操作,通过接口被NopEngine类中所定义的这两个方法所批量实例化,即“nopCommerce”是通过NopEngine类实例来统一管理和实例化“nopCommerce”程序所有的自定义接口及其类实现的。NopEngine类实例为了能够更加的实例化类实现,或者为了实例化没有通过相应拷贝构造方法所实例化的类实现,NopEngine类中自定义和扩展IServiceProvider接口及其实现方法,以用NopEngine类实例通过该类所定义的泛型方法Resolve<IDataProvider>(T)来实例化“nopCommerce”程序中其它所有的自定义接口及其类实现。但是在使用NopEngine类中自定义和扩展IServiceProvider接口声明的实例之前,则必须对先对IServiceProvider接口声明的实例进行实例化/初始化操作,否则在程序执行时会出现逻辑异常。

注意:

在“nopCommerce”程序现中并没有对IServiceProvider接口及其类实现的显式注入操作,本人推测对IServiceProvider接口及其类实现是.NetCore框架中内置定义类,可能已经隐式的注入到内置依赖注入容器中,所以IServiceProvider接口声明的实例不需要经过显式的注入操作,即可被实例化/初始化操作。

“nopCommerce4.2” 程序实现中是通过NopEngine类所自定义和扩展的依赖注入方法来实现对IServiceProvider接口声明的实例进行实例化/初始化操作的,即在“nopCommerce4.2”程序实现中是可以在不实现自定义和扩展.NetCore框架中的管道方法的情况下来对IServiceProvider接口声明的实例进行实例化/初始化操作的。但是随着.NetCore框架和“Autofac”第三方依赖注入容器实现技术的变迁,在“nopCommerce4.3、nopCommerce4.4” 程序实现中IServiceProvider接口声明的实例进行实例化/初始化操作,则是通过管道中方法中的IapplicationBuilder参数实例的ApplicationServices属性进行实例化/初始化操作的。这种实例化/初始化操作方式更加符合.NetCore框架所定义的实现逻辑和规范,这些实现逻辑和规范主要有以下表现:

    (1)、在.NetCore框架内置具体实现上,是通过管道方法调用HttpContext实例参数,实例化/初始化IServiceProvider接口所声明的实例,即.NetCore框架通过管道方法实例化/初始化了IServiceProvider接口所声明的实例,并通过IServiceProvider接口所声明的实例和一个指定的接口声明/抽象调用GetRequiredService<T>()、GetService<T>()方法来实例化一个/批实现类的。

    (2)、在程序的实际使用过程中IServiceProvider接口所声明的实例,可能存在于客户端(浏览器)->服务器端->客户端(浏览器)整个过程(例如:第一次执行程序时远程的通过客户端(浏览器),在服务器端中自/手动的在相应数据库软件中生成数据库、表、字段、映射规则和初化数据信息),所以把IServiceProvider接口所声明的实例实例化/初始化操作是符合.NetCore框架对管道方法实现功能定位的。

    (3)、IServiceProvider接口所声明的实例实例化/初始化操作,在“nopCommerce4.2” 程序实现中从实现逻辑、具体实现方法和步骤比“nopCommerce4.3、nopCommerce4.4” 程序实现相对而言比较简单易懂,毕竟在“nopCommerce4.2”实例化操作中存在与服务器端。但是随着技术的发展,.NetCore3.x及其之后的框架,把IServiceProvider接口所声明的实例实例化/初始化操作从依赖注入方法迁移定义到了管道方法中,现今(2021年5月24日)为止,最新的.NetCore框架与“Autofac”第三方依赖注入容器不再支持在依赖注入方法中直接实例化IServiceProvider接口所声明的实例,所以如果使用最新的.NetCore框架与“Autofac”第三方依赖注入容器进行程序开发,就必须先在NopEngine类中完成对.NetCore框架中的管道方法的自定义和扩展。通过自定义和扩展后的管道方法代替原管道方法,执行程序后正常运行默认网页。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值