NopCommerce架构分析-依赖注入

先说ASP.NET Core的运行原理

  在Nop.Web中有一个Startup.cs文件,对ASP.NET Core程序而言,Startup.cs是必须的。ASP.NET Core在程序启动时会从assemblies中找到名字叫Startup的类,如果存在多个名为Startup的类,则会先找到项目根名称空间下的Startup类。在Startup必须定义Configure方法,而ConfigureServices方法则是可选的,方法会在程序第一次启动时被调用,类似传统的ASP.NET MVC的路由和应用程序状态均可在Startup中配置,也可以在此安装所需中间件等等。我们这里要说的依赖注入,就是从ConfigureServices方法开始。

NopCommerce的依赖注册过程

  在ConfigureServices方法中,调用扩展类ServiceCollectionExtensions的ConfigureApplicationServices方法,里面主要是使用了Nop.Core.Infrastructure中的NopEngine对象,进行服务配置。使用WebAppTypeFinder找到所有的INopStartup对象,实例化并配置所有的服务。然后开始注册服务,同样使用WebAppTypeFinder找到所有的IDependencyRegistrar对象,实例化并注册所有服务。以Nop.Web.Framework.Infrastructure中的DependencyRegistrar为例,注册了web helper、user agent helper、data layer、repositories、plugins、cache manager、work context、store context、自定义services、all settings、event consumers等等。

Autofac  

  NopCommerce是通过Autofac的ContainerBuilder作为容器进行依赖注入的。Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高。主要方法如下:

  1、InstancePerDependency

  对每一个依赖或每一次调用创建一个新的唯一的实例。这也是默认的创建实例的方式。

  2、InstancePerLifetimeScope

  在一个生命周期域中,每一个依赖或调用创建一个单一的共享的实例,且每一个不同的生命周期域,实例是唯一的,不共享的。

  3、InstancePerMatchingLifetimeScope

  在一个做标识的生命周期域中,每一个依赖或调用创建一个单一的共享的实例。打了标识了的生命周期域中的子标识域中可以共享父级域中的实例。若在整个继承层次中没有找到打标识的生命周期域,则会抛出异常: DependencyResolutionException。

  4、InstancePerOwned

  在一个生命周期域中所拥有的实例创建的生命周期中,每一个依赖组件或调用Resolve()方法创建一个单一的共享的实例,并且子生命周期域共享父生命周期域中的实例。若在继承层级中没有发现合适的拥有子实例的生命周期域,则抛出异常:DependencyResolutionException。

  5、SingleInstance

  每一次依赖组件或调用Resolve()方法都会得到一个相同的共享的实例。其实就是单例模式。

  6、InstancePerHttpRequest

  在一次Http请求上下文中,共享一个组件实例。仅适用于asp.net mvc开发。

  

原文地址:https://www.cnblogs.com/tingqianzhu/p/8588961.html