zoukankan      html  css  js  c++  java
  • SmartStore.Net、NopCommerce 全局异常处理、依赖注入、代码研究

    以下是本人最近对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:是用于测试项目的,并没有实现缓存功能。

        

    (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(只能实现对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控制器

    (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位(字母,数字,下划线,减号)");
  • 相关阅读:
    WinForm控件之【Button】
    P4168 蒲公英 题解
    U91741 题解
    树链剖分 学习笔记
    GCD 及 EXGCD 复习笔记
    javascript中的对象拷贝
    关于Vue.js的v-for,key的顺序改变,影响过渡动画表现
    ajax无刷新上传和下载
    站点开启https和http2
    windows挂载EFI分区
  • 原文地址:https://www.cnblogs.com/gougou1981/p/9581470.html
Copyright © 2011-2022 走看看