NopCommerce4.7源码架构详解-依赖注入分析

NopCommerce4.7整个代码里面都贯彻了一个面向接口编程的思想。nopCommerce4.7商城系统提供了两种依赖注入的形成,可以自行选择。

因为最开始没有出现.net core的时候就是采用的autofac,自从升级为asp.net core后,框架默认提供了一个依赖注入容器。那么autofac和默认的依赖注入容器有什么区别呢?

一、UseDefaultServiceProvider 与autofac的区别

UseDefaultServiceProvider是ASP.NET Core中的一个方法,用于设置默认的依赖注入容器。而Autofac是一个开源的轻量级依赖注入容器,用于.NET应用程序。

UseDefaultServiceProvider和Autofac的主要区别如下:

  • 功能和特性UseDefaultServiceProvider提供了基本的依赖注入功能,而Autofac提供了更丰富的功能,如属性注入、多租户支持、AOP等。
  • 配置方式UseDefaultServiceProvider的配置相对简单,通常在Startup类的ConfigureServices方法中进行服务注册。而Autofac的配置更加灵活,可以通过代码、配置文件或混合方式进行注册。
  • 适用场景:如果项目对依赖注入的需求比较简单,UseDefaultServiceProvider可能就足够了。但如果需要更高级的功能或更灵活的配置,Autofac可能更适合。

总的来说,UseDefaultServiceProvider适合简单的依赖注入场景,而Autofac则提供了更强大和灵活的功能,适用于更复杂的应用程序。在选择使用哪种方式时,需要根据项目的具体需求和架构来决定。nop4.7默认是采用的autoc。

二、开启autofac的方法

我们可以看一下切换依赖注入容器代码,如下图:

配置文件在Nop.Web项目中的App_Data文件夹中的appsettings.json中,如下图:

我是从官方下载的源码,没有做过改动。默认就是true。

三、nop中依赖注入相关源码分析

今天我们就来分析一下里面的源码,学习一下Nop在依赖注入方面设计思想,希望在以后的架构设计中对你有启发和帮助。

下面是Nop依赖注入相关类图。

EngineContext、ServiceCollectionExtensions(扩展方法)、NopEngine、NopStartup

下面我们再来看看这些类的核心代码。

我们打开Nop.Web项目的所有的Controller源码,可以看到基本上都是通过构造函数引用抽象的接口。如BlogController的构造函数的参数类型都是某一个接口,如下图:

那我们要想看这些接口到底依赖的是哪一个真正的实现类呢?

在项目Nop.Web.Framework中有一个类NopStartup,其作用就是采用接口IServiceCollection相关的API进行依赖注入,我们只要打开这个类文件,搜索一个指定的接口,就可以找到它依赖的具体类。例如,我们想看到IBlogService接口是依赖哪一个实现,在这个类中搜索IBlogService,会找到BlogService类注册下面的代码:

 services.AddScoped<IBlogService, BlogService>();

下面我们来看看Nop在网站启动是怎么调用这个NopStartup类呢?

在项目Nop.Web也就是前台的起始项目有一个文件Program里只有一个函数Main,这函数的意义这里就不用说了,我相信学过ASP.NET Core同学都知道它的作用,下面是这个函数的里面有一行关键代码:

 //add services to the application and configure service provider
 builder.Services.ConfigureApplicationServices(builder);

这个方法是类型IServiceCollection的扩展方法。

public static void ConfigureApplicationServices(this IServiceCollection services,
    WebApplicationBuilder builder)
{
    //add accessor to HttpContext
    services.AddHttpContextAccessor();

    //initialize plugins
    var mvcCoreBuilder = services.AddMvcCore();
    var pluginConfig = new PluginConfig();
    builder.Configuration.GetSection(nameof(PluginConfig)).Bind(pluginConfig, options => options.BindNonPublicProperties = true);
    mvcCoreBuilder.PartManager.InitializePlugins(pluginConfig);

    //create engine and configure service provider
    var engine = EngineContext.Create();

    builder.Services.AddRateLimiter(options =>
    {
        var settings = Singleton<AppSettings>.Instance.Get<CommonConfig>();

        options.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(httpContext =>
            RateLimitPartition.GetFixedWindowLimiter(
                partitionKey: httpContext.User.Identity?.Name ?? httpContext.Request.Headers.Host.ToString(),
                factory: partition => new FixedWindowRateLimiterOptions
                {
                    AutoReplenishment = true,
                    PermitLimit = settings.PermitLimit,
                    QueueLimit = settings.QueueCount,
                    Window = TimeSpan.FromMinutes(1)
                }));

        options.RejectionStatusCode = settings.RejectionStatusCode;
    });

    engine.ConfigureServices(services, builder.Configuration);
}

关键代码就是:

 //create engine and configure service provider
 var engine = EngineContext.Create();

创建一个NopEngine的实例,同时作为单例。

再回到扩展方法的ConfigureApplicationServices方法:

上图中的最后一行就是真正开始注册依赖的代码。

箭头代码意思就是找到NopStartup的实例,然后执行其ConfigureServices方法。

所以,整个代码用链:

 Nop.Web.Program(builder.Services.ConfigureApplicationServices(builder))

->EngineContext.Create():var engine = EngineContext.Create();

->engine.ConfigureServices(services, builder.Configuration);

->Nop.Web.Framework.Infrastructure.NopStartup.ConfigureServices(IServiceCollection services, IConfiguration configuration)

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: nopCommerce是一种免费开的电子商务解决方案,可以用于创建和管理在线商店。它具有高度灵活性和可扩展性,适用于各种规模和类型的企业。对于没有技术背景或经验的商家来说,nopCommerce提供了托管解决方案,使他们可以轻松搭建和管理自己的在线商店。 通过nopCommerce托管,商家无需关心服务器设置和管理等技术问题。托管方会提供服务器基础设施、数据库和通信连接等,以确保商店的正常运行和安全性。商家只需要关注商店的内容和产品,并使用nopCommerce的商家后台管理工具进行设置和配置。 托管解决方案还提供了多种商店模板和主题,商家可以根据自己的品牌形象和需求选择合适的外观和布局。此外,托管方还会提供备份和数据恢复等服务,以防止数据丢失和不可预见的故障。 对于一些规模较小的企业或个人商家来说,选择nopCommerce托管可以节省时间和成本,因为他们无需进行服务器配置和维护。同时,nopCommerce托管方会提供技术支持和更新服务,以确保商店始终保持最新和安全的状态。 总之,nopCommerce托管为商家提供了一个简单和方便的方式来创建和管理自己的在线商店。商家可以专注于业务发展,而不必花费过多的时间和精力在技术细节上。无论是初创企业还是规模较大的公司,nopCommerce托管都提供了一个强大和可靠的电子商务解决方案。 ### 回答2: nopCommerce是一个开的电子商务平台,可以通过托管的方式进行部署和运行。托管意味着将整个nopCommerce网站部署在一个托管服务提供商的服务器上,而不需要自己搭建和维护服务器。 选择nopCommerce托管的好处之一是省去了自行购买服务器的成本和用户维护服务器的繁琐工作。托管服务提供商通常会提供稳定的服务器基础设施和网络连接,以确保网站的稳定运行和可靠性。用户只需根据自己的需求选择一个可靠的托管服务提供商,并与其合作购买托管服务,即可将nopCommerce网站部署在托管服务提供商的服务器上。 另一个好处是托管服务商通常会提供备份和恢复的功能,以确保网站数据的安全性。它们会定期备份网站数据,并在需要的时候进行恢复。用户不需要担心数据丢失或损坏的问题,因为托管服务商会负责备份和恢复。 此外,对于不具备服务器管理经验或技术知识的用户来说,托管是一个更好的选择。托管服务提供商会负责服务器的日常维护和管理工作,包括服务器更新、安全补丁和性能优化等。用户只需要关注网站的内容和业务,而不必花费精力去学习和处理服务器管理问题。 当然,与托管服务相关的费用是需要考虑的因素之一。托管服务通常需要付费,其费用取决于所选择的托管服务提供商及其提供的服务级别。用户需要根据自己的预算和需求选择适合的托管服务。 总结起来,nopCommerce托管是一种方便、省力且可靠的选择。它提供了稳定的服务器基础设施、备份和恢复功能,并减轻了用户的服务器管理负担。当然,用户需要根据自己的需求和预算选择合适的托管服务提供商。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值