SmartStore.Net、NopCommerce 全局异常处理、依赖注入、代码研究

摘要:
PublicstaticTModelToModel初始化:AutoMapper由Nop.Core.Infrastructure中的RegisterMapperConfiguration方法初始化。没有引擎类。没有。核心。疼痛。CacheExtensions类扩展了实现ICacheManager并实现Get方法的类。

以下是本人最近对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.FrameworkDependencyRegistrar.cs

2.Nop.Web.InfrastructureDependencyRegistrar.cs

3.Nop.Admin.InfrastructureDependencyRegistrar.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)PresentationNop.WebExtensionsMappingExtensions.cs调用MapTo()方法

(2)PresentationNop.WebAdministrationExtensionsMappingExtensions.cs调用MapTo()方法

四、缓存

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

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

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

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

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

    SmartStore.Net、NopCommerce 全局异常处理、依赖注入、代码研究第1张

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

SmartStore.Net、NopCommerce 全局异常处理、依赖注入、代码研究第2张

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

  SmartStore.Net、NopCommerce 全局异常处理、依赖注入、代码研究第3张SmartStore.Net、NopCommerce 全局异常处理、依赖注入、代码研究第4张

(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类又对上面的类进行了扩展,系统调用了这个类里面以下方法记录日志。

   SmartStore.Net、NopCommerce 全局异常处理、依赖注入、代码研究第5张

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

 SmartStore.Net、NopCommerce 全局异常处理、依赖注入、代码研究第6张

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(只能实现对ActionControllers方法异常的过滤功能)

    (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)PresentationSmartStore.WebExtensionsMappingExtensions.cs调用MapTo()方法

(2)PresentationSmartStore.WebAdministrationExtensionsMappingExtensions.cs调用MapTo()方法

四、WebApi

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

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

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

SmartStore.Net、NopCommerce 全局异常处理、依赖注入、代码研究第7张

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

SmartStore.Net、NopCommerce 全局异常处理、依赖注入、代码研究第8张

SmartStore.Net、NopCommerce 全局异常处理、依赖注入、代码研究第9张

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

SmartStore.Net、NopCommerce 全局异常处理、依赖注入、代码研究第10张

六、实体验证-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 全局异常处理、依赖注入、代码研究》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在Linux驱动中使用gpio子系统bootstrap的selectpicker的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

thinkphp 5 整理笔记

初始化操作initialize 1 //会优先执行该函数 2 public functioninitialize() 3 { 4 echo 'initialize'; 5 } 前置操作 1 protected $beforeActionList =[ 2 //只执行test的时候会执行test1函数 3 //'tes...

gcp cdn

关于cdn是先失效缓存,再上传更新文件,还是先上传文件再失效缓存。 经过测试,认为应该是先上传更新文件再失效缓存。 理由:如果是先失效缓存,还没上传更新文件,这会儿有请求URL,就会导致已经缓存失效的节点,又去源站请求资源,使旧资源重新缓存到了cdn缓存节点。 如果是先上传文件到cdn源站,再使缓存失效,这会儿,就会请求到cdn源站新的内容,并缓存到cdn...

[WCF]将WCF程序部署在IIS上

WCF 机制确实不错,虽然谈不上对它有多了解,但仅从应用的角度看,有两个显著:封装通信,契约编程。下面演练一个Demo 来看看如何将 WCF 部署在IIS里头。这个 Demo 服务器提供一个运算服务,客户端根据服务器契约调用该服务,得到结果。 1,新建一个目录(IIS具有访问权限的,所以别在系统目录中创建) IISHostedCalcService,然后在...

Nginx.conf配置文件参数说明与优化

参考连接:nginx 核心配置优化详解 先说下优化 1、nginx运行工作进程个数 worker_processes 1; Nginx进程,一般设置为和cpu核数一样(nginx启动后有多少个worker处理http请求)(worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。) 2、nginx...

K8S从入门到放弃系列-(1)环境初始化

一、系统规划  主机名 IP   组件  k8s-master01 10.10.0.18 etcd、kube-apiserver、kube-controller-manager、kube-scheduler  k8s-master02 10.10.0.19 etcd、kube-apiserver、kube-controller-manager、...

C# 简单日志文本输出

第一种 直接文件IO流写日志文件 usingSystem.IO; public static void WriteLog(stringstrLog) { string sFilePath="d:\"+DateTime.Now.ToString("yyyyMM"); string sFileName = "rizhi" + DateTime.Now....