创建一个asp.net core项目,可以到到startup类有两个方法
 // This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services)
public void Configure(IApplicationBuilder app, IHostingEnvironment env)

ConfigureServices方法:注册服务到容器中,在整个应用中都可以使用。推荐:自定义方法以Add开头 Configure方法:为应用配置请求管道.推荐:自定义方法以Use开头

这里并不会深入的探讨依赖注入和IApplicationBuilder、IServiceCollection这些核心对象,这篇文章主要目的是快速的了解startup类和如何利用一些开源的项目(nopcommerce)去使用它。

nopcommerce是个优秀的开源的电商项目,应该都不会陌生,不管有没有项目中用到,但不妨碍我们去阅读学习他们优秀的地方。

一起先了解下项目结构 

  • Nop.Core 核心层 :包含领域模型、和基础设施层(缓存、仓储接口、依赖注入、对象映射mapper等)、一些其他工具里的封装

  • Nop.Data 数据层:orm与数据库的一些操作,仓储实现类,领域和表的映射等

  • Nop.Services 应用服务层:业务服务操作

  • Plugins 插件:nop 是插件式开发 ,扩展起来很是方便

  • Nop.Web 表现层:ui交互

  • Nop.Web.Framework:对asp.netcore mvc 进行一些扩展和封装

在回到今天的主角startup类 我进入Nop.Web项目 打开startup类

 public class Startup    {#region Fields

private readonly IConfiguration _configuration;private readonly IHostingEnvironment _hostingEnvironment;

#endregion

#region Ctor

public Startup(IConfiguration configuration, IHostingEnvironment hostingEnvironment){ _configuration = configuration; _hostingEnvironment = hostingEnvironment; }

#endregion

是不是很简洁,可以发现nop对IServiceCollection、IApplicationBuilder进行扩展了两个方法类 分别ServiceCollectionExtensions、ApplicationBuilderExtensions,下面我们分别快速的浏览这两个类的源码

我们F12进入ConfigureApplicationServices的实现方式一步一步的查看

 var engine = EngineContext.Create();
  
protected virtual IServiceProvider RegisterDependencies(IServiceCollection services, ITypeFinder typeFinder)        {var containerBuilder = new ContainerBuilder();

F12进入ConfigureRequestPipeline

  EngineContext.Current.ConfigureRequestPipeline(application);
 public void ConfigureRequestPipeline(IApplicationBuilder application)        {

到此这两个文件的源码已经过完了,觉得很核心的几个对象

  • EngineContext:NopEngine的实例上下文 作用 获取创建和获取NopEngine的实例上下文的实例(涉及到的设计模式单例)

  • IEngine、NopEngine:nop引擎还是很体贴的,里面封装了使用的方法如ioc 解析方法Resolve

  • INopStartup :在应用程序启动时配置服务和中间件 当时我看过源码,有几处还是很巧妙的,下面我整理下,多个为什么,带着问题去看,印象更深刻,也达到了参考nop源码学习startup类的目的。

  1. 接口INopStartup作用?INopStartup有两个方法ConfigureServices,Configure 跟Startup方法作用都是一样的,nop把它抽离成接口的好处,可以很方便通过反射把实现INopStartup的类查找出来,然后掉用ConfigureServices,Configure方法

 var typeFinder = new WebAppTypeFinder();var startupConfigurations = typeFinder.FindClassesOfType<INopStartup>();

var instances = startupConfigurations                .Select(startup => (INopStartup)Activator.CreateInstance(startup))                .OrderBy(startup => startup.Order);

            foreach (var instance in instances) instance.ConfigureServices(services, configuration);

 foreach (var instance in instances) instance.Configure(application);
  1. nop使用Autofac作为注入框架,它是如何实现的

     var containerBuilder = new ContainerBuilder();
  1. 接口IEngine的作用?配置startup 服务和请求管道、autofac注册和解析

IServiceProvider ConfigureServices(IServiceCollection services, IConfiguration configuration);void ConfigureRequestPipeline(IApplicationBuilder application);T Resolve<T>() where T : class;
  1. 如何使用注入的服务?

1.我们在Nop.Services项目中添加ProductService和ProductAttributeService两个业务服务

    public class ProductService : IProductService    {public string GetProductById(int productId){return "获取产品"; } }

public class ProductAttributeService: IProductAttributeService {public string GetProductAttributeById(int productAttributeId){return "获取产品属性"; } }

2.我们实现IDependencyRegistrar依赖注册接口

 public class DependencyRegistrar : IDependencyRegistrar    {

3.然后在homecontroller中测试,第一种构造函数注入,第二种直接使用IEngine的实例解析

       #region filedsprivate readonly IProductService productService;#endregionpublic HomeController(IProductService productService){this.productService = productService; }public IActionResult Index(){

然后运行查看效果

解析成功,展示的只是本分代码,实例代码上传到github上,喜欢的可以clone下来,自己调试调试,稍微调整下,放心用在自己的项目中,因为nop已经比较成熟了。

原文:https://www.cnblogs.com/chengtian/p/11265175.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

阅读nopcommerce startup源码相关推荐

  1. rust墙壁升级点什么_分享:如何在阅读Rust项目源码中学习

    今天做了一个Substrate相关的小分享,公开出来. 因为我平时也比较忙,昨天才选定了本次分享的主题,准备比较仓促,细节可能不是很充足,但分享的目的也是给大家提供一个学习的思路,更多的细节大家可以在 ...

  2. 知识付费阅读小程序源码,前端+后台+代理+分销

    介绍: 知识付费阅读小程序源码,前端+后台源码,带有代理,分销,课程资源更新等等功能. 没有安装教程,微擎的就不多说了. 网盘下载地址: http://kekewangLuo.net/R9cbFxmn ...

  3. 新版知识付费系统付费阅读小程序源码知识付费平台

    介绍: 2021知识付费系统付费阅读小程序源码知识付费平台源码. 知识付费的小程序源码的作用我就不多说了,现在都是知识付费的年代,也是付费学习的时代. 知识付费阅读小程序,带有代理,分销,课程资源更新 ...

  4. 封装成jar包_通用源码阅读指导mybatis源码详解:io包

    io包 io包即输入/输出包,负责完成 MyBatis中与输入/输出相关的操作. 说到输入/输出,首先想到的就是对磁盘文件的读写.在 MyBatis的工作中,与磁盘文件的交互主要是对 xml配置文件的 ...

  5. android优化中国风应用、完整NBA客户端、动态积分效果、文件传输、小说阅读器等源码...

    Android精选源码 android拖拽下拉关闭效果源码 一款优雅的中国风Android App源码 EasySignSeekBar一个漂亮而强大的自定义view15 android仿蘑菇街,蜜芽宝 ...

  6. golangsha1解码_如何阅读Golang的源码?

    Go 的源码在安装包的 src/ 目录下.怎么看它的源码呢?直接看吧!没人教的情况下,只能自己撸了.当然,这种内容一般也不会有人教. 怎么撸? Go 源码中,应该可分为与语言息息相关的部分,和官方提供 ...

  7. daily news新闻阅读客户端应用源码(兼容iPhone和iPad)

    daily news新闻阅读客户端应用源码(兼容iPhone和iPad),也是一款兼容性较好的应用,可以支iphone和ipad的阅读阅读器源码,设计风格和排列效果很不错,现在做新闻资讯客户端的朋友可 ...

  8. Android --- IjkPlayer 阅读native层源码之解码成功后的音频数据如何发送回Android播放(九)

    整章目录:Android------- IjkPlayer 源码学习目录 本篇会有很多源代码,请注意阅读每行代码上面的注释. 本篇介绍的主要内容为上图红框圈起部分: 在前面介绍了如何将一个AvPack ...

  9. java计算机毕业设计小说阅读网站系统源码+lw文档+系统+数据库

    java计算机毕业设计小说阅读网站系统源码+lw文档+系统+数据库 java计算机毕业设计小说阅读网站系统源码+lw文档+系统+数据库 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开 ...

最新文章

  1. HTTP 状态代码及其定义
  2. R语言进行数据聚合统计(Aggregating transforms)计算滑动窗口统计值(Window Statistics):使用R原生方法、data.table、dplyr等方案、计算滑动分组统计
  3. 我常用的Eclipse插件
  4. Java不要放弃之路
  5. jQuery UI全教程之一(dialog的使用教程)
  6. mysql常见错误及解决办法_mysql常见错误代码、原因及处理办法
  7. vue.js中H5使用微信摇一摇抽奖,判断摇一摇次数
  8. 怎么配置宝塔linux环境,宝塔面板linux怎么安装
  9. Python与Memcached交互
  10. 我的世界f服务器自定义皮肤,我的世界服务器皮肤指令
  11. 【Android】软件开发中遇到的LUT
  12. 中国离合器行业运行态势及产销需求预测报告2021-2027年
  13. java 商城 商品查询_Javaweb网上商城项目实战(17)实现商品详情查询
  14. 豪拒60亿美元,天真的程序员CEO最终被自己的公司解雇
  15. 在django的form表单及ajax提交的数据中添加认证的csrfmiddlewaretoken
  16. JavaScript 访问 JSF 组件
  17. 关于面试总结3-SQL查询
  18. Docker概述、安装及基础命令
  19. Tensorflow-slim 做扑克,麻将,花牌的分类
  20. 内网计算机病毒如何查杀,Windows7如何查杀ARP病毒?

热门文章

  1. 垂直居中及容器内图片垂直居中的CSS解决方法
  2. CSS布局解决方案(终结版) 1
  3. 稍微成型点的用WEBSOCKET实现的实时日志LOG输出
  4. 最全前端开发面试问题及答案整理
  5. maven3安装和使用笔记
  6. 你可能不知道的C#语言特性
  7. C# Barrier类
  8. C# 动态创建控件时注册Name属性
  9. 为什么中国这么多高薪程序员,开发不出Java, Typescript, Python, Rust, Node.js这些基础设施?...
  10. Source Generators实现简版AutoMapper