以下是本人最近对NopCommerce和SmartStore.net部分代码的研究和总结,主要集中于:依赖注入、异常处理、对象映射、系统缓存、日志这些方面,供大家参考。

NOP 3.8

/// <summary>
/// 在NOP的运动环境中 进行组件、插件初始化、依赖注入、任务启动
/// </summary>
/// <param name="config">Config</param>

public void Initialize(NopConfig config)
{  

//依赖注入
RegisterDependencies(config);

//注册对象映射关系
RegisterMapperConfiguration(config);

//startup tasks启动任务
if (!config.IgnoreStartupTasks)
{
RunStartupTasks();
}

}

一、全局异常捕获处理:Global.asax.cs>>Application_Error     

二、依赖注入

调用位置:Nop.Core.Infrastructure>NopEngine方法中调用了RegisterDependencies()方法

1.Nop.Web.Framework\DependencyRegistrar.cs

2.Nop.Web.Infrastructure\DependencyRegistrar.cs

3.Nop.Admin.Infrastructure\DependencyRegistrar.cs

4.其他插件类库中也有

三、AutoMapper对象映射转换工具

位置:Nop.Admin.Infrastructure.Mapper.AdminMapperConfiguration类中GetConfiguration()方法。

功能:

  实现了Nop.Core.Domain.Common领域层中各实体类到Nop.Admin.Models.Common表示层各Model模型的对象映射。

  (1)使用Ignore忽略一些字段的映射。

  (2)对领域层中实体可以为null的字段作判断,映射到模型类为相应的值

  (3)MappingExtensions类根据GetConfiguration中的配置,进行映射(类型转换)

  (4)ADMIN和web层相应有各自的model,所以需要不同的MappingExtensions进行相应转换,而GetConfiguration()配置则只有一处。

  (5)NOP 4.10开始MappingExtensions代码中使用了泛型方法,简化了各类型的转换工作。

    public static TModel ToModel<TEntity, TModel>(this TEntity entity, TModel model)

初始化:Nop.Core.Infrastructure.NopEngine引擎类中的RegisterMapperConfiguration(NopConfig config)方法进行了AutoMapper的初始化。

对象如何转换

(1)\Presentation\Nop.Web\Extensions\MappingExtensions.cs调用MapTo()方法

(2)\Presentation\Nop.Web\Administration\Extensions\MappingExtensions.cs调用MapTo()方法

四、缓存

(1)以下几个类分别实现了Nop.Core.Caching.ICacheManager接口

  RedisCasheManager:数据存在于Redis中(缓存使用范围更加广泛,包括Azure或者其他服务器的站点)

  MemoryCacheManager:数据缓存在内存中(表示用于在HTTP请求(长期缓存)之间进行缓存的管理器)

  PerRequestCacheManager:数据缓存于HttpContextBase.Items的键值集合中(表示在HTTP请求(短期缓存)期间缓存的管理器,比如一个页面中多次请求一个方法)

  NopNullCache:是用于测试项目的,并没有实现缓存功能。

    

(2)对实现类进行依赖注入:Nop.Web.Framework.DependencyRegistrar()方法中进行了短期缓存、长期缓存(RedisCacheManager或者MemoryCacheManager)的注册。

(3)Nop.Core.Caching.CacheExtensions类(4.0以上版本无此类)对实现了ICacheManager的类(PerRequestCacheManager、RedisCacheManager、MemoryCacheManager)进行了扩展,实现了Get方法。Get方法中缓存存在时会立刻返回数据,不存在时会通过Func<T>代理方法,自动添加到缓存列表中,缓存默认时间为60秒。

  

(4)系统调用了CacheExtensions中的Get()方法对系统数据进行了缓存(存在则返回,不存在则加入缓存列表)

(5)系统调用了MemoryCacheManager中的RemoveByPattern方法对系统数据在指定持续时间(60秒)过后逐出缓存项,另外系统主要在服务层、表示层、插件层调用了这些缓存的相关方法。

 五、系统日志

(1)Nop.Web.Framework.DependencyRegistrar.Register()方法中对日志组件进行了注入

    builder.RegisterType<DefaultLogger>().As<ILogger>().InstancePerLifetimeScope();

(2)DefaultLogger类实现了日志的增、删、查功能。(nop默认将日志记录在了数据中)

(3)Nop.Services.Logging.LoggingExtensions类又对上面的类进行了扩展,系统调用了这个类里面以下方法记录日志。

  

 六、EF多表联查、分页功能(商品销售排行报表)

SmartStore.net 3.x

Global.asas.cs中的Application_Start()方法中进行环境初始化,依赖注入、组件初始化

一、依赖注入:

SmartStore.Core.Infrastructure.EngineContext.CreateEngineInstance()方法,最后调用SmartStoreEngine()方法

(1)SmartStore.Core.Infrastructure.SmartStoreEngine类中RegisterDependencies()方法

(2)SmartStore.Core.Logging.LoggingModule (继承了 Autofac.Module)调用了Autofac.Module.Load()方法进行注册。

(3)SmartStore.Web.Framework.DependencyRegistrar(继承了IDependencyRegistrar)中的Register()方法,注册了所有的模块(这些模块都继承了Autofac.Module)

二、全局异常捕获:

(1)MVC:SmartStore.Web.Framework.Filters中的HandleExceptionFilter

(2)WebApi:SmartStore.Web.Framework.Filters.WebApiExceptionFilterAttribute(只能实现对Action\Controllers方法异常的过滤功能)

    (1)SmartStore.Web.Framework.DependencyRegistrar类(661行)Load(ContainerBuilder builder)方法增加了builder.RegisterApiControllers(foundAssemblies),实现了对WebApiControllers的注册。

    (2)SmartStore.Web.Framework.WebApi.WebApiStartupTask的Execute()方法增加了WebApiExceptionFilterAttribute、WebApiExceptionLogger、WebApiExceptionHandler,对新增过虑器进行注册。

(3)WebApi全局异常捕获(针对HandleExceptionFilter捕获不到的异常)

    (1)SmartStore.Web.Framework.WebApi.WebApiExceptionLogger类

    (2)SmartStore.Web.Framework.WebApi.WebApiExceptionLogger.WebApiExceptionHandler类

三、AutoMapper对象映射转换工具

位置:SmartStore.Admin.Infrastructure.AutoMapperAdminProfile类中AutoMapperAdminProfile()方法。

功能:实现了SmartStore.Core.Domain.Common领域层中各实体类到SmartStore.Admin.Models.Common表示层各Model模型的对象映射。

初始化:Global.asas.cs中调用了RegisterClassMaps(IEngine engine)方法中进行了AutoMapper初始化工作

对象如何转换

(1)\Presentation\SmartStore.Web\Extensions\MappingExtensions.cs调用MapTo()方法

(2)\Presentation\SmartStore.Web\Administration\Extensions\MappingExtensions.cs调用MapTo()方法

四、WebApi

(1)SmartStore.Web.Framework.WebApi.WebApiStartupTask类实现了IStartupTask接口(会在系统初始化时调用)

(2)WebApiStartupTask类中Execute方法实现了WebApi路由注册

(3)SmartStore.Web.Controllers.ValuesController为自己在web层新建立的webapi控制器

(3)在类名、方法名加属性[WebApiAuthenticate(Permission = "ManageImports")]以实现对Api的客户端认证。

(5)具体WebApi实现代码请查看SmartStore.WebApi插件项目(可以用SmartStore.WebApi.Client工具进行客户端调试)

六、实体验证-FluentValidation

示例代码-自己增加了一个正则表达式的验证-具体请参考系统(SmartStore.Web.Validators.Customer.RegisterValidator)

RuleFor(x => x.Email).NotEmpty().WithMessage(localizationService.GetResource("Account.Fields.Email.Required"));
RuleFor(x => x.Email).EmailAddress().WithMessage(localizationService.GetResource("Common.WrongEmail"));
RuleFor(x => x.FirstName).NotEmpty().WithMessage(localizationService.GetResource("Account.Fields.FirstName.Required"));
RuleFor(x => x.LastName).NotEmpty().WithMessage(localizationService.GetResource("Account.Fields.LastName.Required"));
RuleFor(x => x.Username).Matches(@"^[a-zA-Z0-9_-]{4,16}$").WithMessage("4到16位(字母,数字,下划线,减号)");

SmartStore.Net、NopCommerce 全局异常处理、依赖注入、代码研究的更多相关文章

  1. 利用Lombok编写优雅的spring依赖注入代码,去掉繁人的@Autowired

    大家平时使用spring依赖注入,都是怎么写的? @Servicepublic class OrderService {@Autowiredprivate UserService userServic ...

  2. ASP.NET Core 中间件的使用(三):全局异常处理机制

    前言 我们经常听到"秒修复秒上线",觉得很厉害的样子. 其实不然,这只是一个调侃而已,出现问题的方式很多(逻辑漏洞.代码异常.操作方式不正确等). 我们今天来说代码异常问题怎么快速 ...

  3. 细数Javascript技术栈中的四种依赖注入

    作为面向对象编程中实现控制反转(Inversion of Control,下文称IoC)最常见的技术手段之一,依赖注入(Dependency Injection,下文称DI)可谓在OOP编程中大行其道 ...

  4. go语言依赖注入实现

    最近做项目中,生成对象还是使用比较原始的New和简单工厂的方式,使用过程中感觉不太爽快(依赖紧密,有点改动就比较麻烦),还是比较喜欢使用依赖注入的方式. 然后网上没有找到比较好用的依赖注入包,就自己动 ...

  5. 基于DDD的.NET开发框架 - ABP依赖注入

    返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

  6. 基于.NET平台的分层架构实战(六)——依赖注入机制及IoC的设计与实现[转]

    原文:http://www.cnblogs.com/leoo2sk/archive/2008/06/19/1225223.html 我们设计的分层架构,层与层之间应该是松散耦合的.因为是单向单一调用, ...

  7. Spring Boot 2.x 系列教程:WebFlux REST API 全局异常处理 Error Handling

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 本文内容 为什么要全局异常处理? WebFlux REST 全 ...

  8. 第六节:SignalR完结篇之依赖注入和分布式部署

    一. SignalR中DI思想的应用 DI,即依赖注入,它是一种不负责创建其自己的依赖项对象的一种模式,通常用来降低代码之间的耦合性,广泛应用于架构设计,是必不可少的一种思想. 下面结合一个需求来说一 ...

  9. ABP的依赖注入

    目录 说说ABP的依赖注入 代码追踪 说说ABP的依赖注入 上篇abp运行机制分析分析了ABP在启动时,都做了那些事:这篇我们来说说ABP的最核心的一部分:依赖注入(DependencyInjecti ...

随机推荐

  1. Window开启上帝模式

    所谓的上帝模式就是所有功能在一个文件下,方便.快捷地操作! 01.新建一个文件夹 02.重命名文件夹 文件夹重命名为“GodMode.{ED7BA470-8E54-465E-825C-99712043 ...

  2. Ubuntu 下搭建 Android 开发环境(图文)

    转自 http://dawndiy.com/archives/153/ 1.安装JDK 1.下载JDK 目前最新的JDK版本是:Java SE Development Kit 7u5 下载地址: 查看 ...

  3. 自动化测试中CSS SELECTOR选择器的一些写法

    常见符号: #表示id .表示class >表示子元素,层级 一个空格也表示子元素,但是是所有的后代子元素,相当于xpath中的相对路径 #input 选择id为input的节点 .Volvo ...

  4. PHP——自定义比较算法

    很多时候,程序都是直接写好逻辑运算,提供给用户的是一个值,然后后台去比较:但是有时会提供一种类似计算器一样的交互方式的时候,PHP只能读懂用户的输入来进行比较了- 最近的一个项目涉及到一个由用户自定义 ...

  5. Winform开发框架之通用Windows摄像头调用拍照--SNF快速开发平台3.3-Spring.Net.Framework

    今天做了一个windows系统下调用摄像头.进行开启.关闭.拍照.设置等等功能演示. 进行源码贡献,欢迎大家下载使用 一.DEMO效果如下: 二.DEMO演示代码如下: using SNF.Utili ...

  6. Spark 论文篇-Spark:工作组上的集群计算的框架(中英双语)

    论文内容: 待整理 参考文献: Spark: Cluster Computing with Working Sets. Matei Zaharia, Mosharaf Chowdhury, Micha ...

  7. 开发第一个flutter程序 hello world

    上一篇咱们配置了flutter的基本环境之后,那么本篇就来讲一下如何开发第一个小应用hello world 双击打开 android studio 选择plugins 找到 fultter 并且下载安 ...

  8. 【Java】Java Queue的简介

    阻塞队列 阻塞队列有几个实现: ArrayBlockingQueue LinkedBlockingQueue PriorityBlockingQueue DelayQueue SynchronousQ ...

  9. 【Java】分布式RPC通信框架Apache Thrift 使用总结

    简介 Apache Thrift是Facebook开源的跨语言的RPC通信框架,目前已经捐献给Apache基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于th ...

  10. java框架篇---hibernate之session状态

    Session接口是Hibernate向程序提供操纵数据库的最主要接口,是单线程对象,它提供了基本的保存.更新.删除和查询方法.它有一个缓存,保存了持久化对象,当清理缓存时,按照这些持久化对象同步更新 ...