阅读nopcommerce startup源码
创建一个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类的目的。
接口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);
nop使用Autofac作为注入框架,它是如何实现的
var containerBuilder = new ContainerBuilder();
接口IEngine的作用?配置startup 服务和请求管道、autofac注册和解析
IServiceProvider ConfigureServices(IServiceCollection services, IConfiguration configuration);void ConfigureRequestPipeline(IApplicationBuilder application);T Resolve<T>() where T : class;
如何使用注入的服务?
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源码相关推荐
- rust墙壁升级点什么_分享:如何在阅读Rust项目源码中学习
今天做了一个Substrate相关的小分享,公开出来. 因为我平时也比较忙,昨天才选定了本次分享的主题,准备比较仓促,细节可能不是很充足,但分享的目的也是给大家提供一个学习的思路,更多的细节大家可以在 ...
- 知识付费阅读小程序源码,前端+后台+代理+分销
介绍: 知识付费阅读小程序源码,前端+后台源码,带有代理,分销,课程资源更新等等功能. 没有安装教程,微擎的就不多说了. 网盘下载地址: http://kekewangLuo.net/R9cbFxmn ...
- 新版知识付费系统付费阅读小程序源码知识付费平台
介绍: 2021知识付费系统付费阅读小程序源码知识付费平台源码. 知识付费的小程序源码的作用我就不多说了,现在都是知识付费的年代,也是付费学习的时代. 知识付费阅读小程序,带有代理,分销,课程资源更新 ...
- 封装成jar包_通用源码阅读指导mybatis源码详解:io包
io包 io包即输入/输出包,负责完成 MyBatis中与输入/输出相关的操作. 说到输入/输出,首先想到的就是对磁盘文件的读写.在 MyBatis的工作中,与磁盘文件的交互主要是对 xml配置文件的 ...
- android优化中国风应用、完整NBA客户端、动态积分效果、文件传输、小说阅读器等源码...
Android精选源码 android拖拽下拉关闭效果源码 一款优雅的中国风Android App源码 EasySignSeekBar一个漂亮而强大的自定义view15 android仿蘑菇街,蜜芽宝 ...
- golangsha1解码_如何阅读Golang的源码?
Go 的源码在安装包的 src/ 目录下.怎么看它的源码呢?直接看吧!没人教的情况下,只能自己撸了.当然,这种内容一般也不会有人教. 怎么撸? Go 源码中,应该可分为与语言息息相关的部分,和官方提供 ...
- daily news新闻阅读客户端应用源码(兼容iPhone和iPad)
daily news新闻阅读客户端应用源码(兼容iPhone和iPad),也是一款兼容性较好的应用,可以支iphone和ipad的阅读阅读器源码,设计风格和排列效果很不错,现在做新闻资讯客户端的朋友可 ...
- Android --- IjkPlayer 阅读native层源码之解码成功后的音频数据如何发送回Android播放(九)
整章目录:Android------- IjkPlayer 源码学习目录 本篇会有很多源代码,请注意阅读每行代码上面的注释. 本篇介绍的主要内容为上图红框圈起部分: 在前面介绍了如何将一个AvPack ...
- java计算机毕业设计小说阅读网站系统源码+lw文档+系统+数据库
java计算机毕业设计小说阅读网站系统源码+lw文档+系统+数据库 java计算机毕业设计小说阅读网站系统源码+lw文档+系统+数据库 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开 ...
最新文章
- HTTP 状态代码及其定义
- R语言进行数据聚合统计(Aggregating transforms)计算滑动窗口统计值(Window Statistics):使用R原生方法、data.table、dplyr等方案、计算滑动分组统计
- 我常用的Eclipse插件
- Java不要放弃之路
- jQuery UI全教程之一(dialog的使用教程)
- mysql常见错误及解决办法_mysql常见错误代码、原因及处理办法
- vue.js中H5使用微信摇一摇抽奖,判断摇一摇次数
- 怎么配置宝塔linux环境,宝塔面板linux怎么安装
- Python与Memcached交互
- 我的世界f服务器自定义皮肤,我的世界服务器皮肤指令
- 【Android】软件开发中遇到的LUT
- 中国离合器行业运行态势及产销需求预测报告2021-2027年
- java 商城 商品查询_Javaweb网上商城项目实战(17)实现商品详情查询
- 豪拒60亿美元,天真的程序员CEO最终被自己的公司解雇
- 在django的form表单及ajax提交的数据中添加认证的csrfmiddlewaretoken
- JavaScript 访问 JSF 组件
- 关于面试总结3-SQL查询
- Docker概述、安装及基础命令
- Tensorflow-slim 做扑克,麻将,花牌的分类
- 内网计算机病毒如何查杀,Windows7如何查杀ARP病毒?
热门文章
- 垂直居中及容器内图片垂直居中的CSS解决方法
- CSS布局解决方案(终结版) 1
- 稍微成型点的用WEBSOCKET实现的实时日志LOG输出
- 最全前端开发面试问题及答案整理
- maven3安装和使用笔记
- 你可能不知道的C#语言特性
- C# Barrier类
- C# 动态创建控件时注册Name属性
- 为什么中国这么多高薪程序员,开发不出Java, Typescript, Python, Rust, Node.js这些基础设施?...
- Source Generators实现简版AutoMapper