Nop源码分析二

上文咱们已经经过该行代码:var typeFinder = containerManager.Resolve<ITypeFinder>(); 从注入容器中获取到了typeFinder实例。缓存

经过该实例进行如下操做。app

 var drTypes = typeFinder.FindClassesOfType<IDependencyRegistrar>(); 从bin全部程序集中获取实现了IDependencyRegistrar接口的全部实现类。循环这些实现类病调用 void Register(ContainerBuilder builder, ITypeFinder typeFinder);方法来作其余事情。asp.net

经过反射可以获取到8个实现了该接口的实例,下面咱们一个个分析,实现了这些接口的类都作了什么事情。ide

1,DependencyRegistrar : IDependencyRegistrar函数

    A:注册HTTP context and other related stuff,ui

   B:注册WebHelper。 builder.RegisterType<WebHelper>().As<IWebHelper>().InstancePerHttpRequest();google

   C:注册程序集中的全部控制器。  builder.RegisterControllers(typeFinder.GetAssemblies().ToArray());.net

   D:注册和数据访问层相关的类。插件

  E:注册插件和缓存相关的类。索引

  F:注册worker和store相关的类。

G:注册全部实现类。

H:注册和客户相关的类:consumers = typeFinder.FindClassesOfType(typeof(IConsumer<>)).ToList();

I:注册发布订阅服务类:

            builder.RegisterType<EventPublisher>().As<IEventPublisher>().SingleInstance();
            builder.RegisterType<SubscriptionService>().As<ISubscriptionService>().SingleInstance();

2,注册和税相关的组件:

      DependencyRegistrar : IDependencyRegistrar

    builder.RegisterType<TaxRateService>().As<ITaxRateService>().InstancePerHttpRequest();

3,注册和google相关的服务。

4,注册:  builder.RegisterType<OpenIdProviderAuthorizer>().As<IOpenIdProviderAuthorizer>().InstancePerHttpRequest();
            builder.RegisterType<OpenIdRelyingPartyService>().As<IOpenIdRelyingPartyService>().InstancePerHttpRequest();

 5,注册            builder.RegisterType<FacebookProviderAuthorizer>().As<IOAuthProviderFacebookAuthorizer>().InstancePerHttpRequest();

6,   builder.RegisterType<HomeController>()
                .WithParameter(ResolvedParameter.ForNamed<ICacheManager>("nop_cache_static"));

7,注册一些控制器和            builder.RegisterType<InstallationLocalizationService>().As<IInstallationLocalizationService>().InstancePerHttpRequest();

8,注册一个和重量相关的服务类。

9,注册broker类。

至此全部容器注入的工做所有完成,下面开始初始化一些工做。

全部的工做所有在  RunStartupTasks();方法中完成。

startUpTaskTypes = typeFinder.FindClassesOfType<IStartupTask>(); 该行代码获取程序集中全部实现了IStartupTask接口的的类。

循环遍历实现类,并执行Execute()方法。来完成全部的初始化工做,代码以下:

 foreach (var startUpTask in startUpTasks)
                startUpTask.Execute();

1,EfStartUpTask : IStartupTask :ef相关的初始化,存储过程,函数索引等。

2,初始化GoogleProductObjectContext等。

3,初始化AutoMapperStartupTask,实体好模型的自动映射类。

4,set localization service for telerik 。

至此initialize engine context的工做所有完成。
            EngineContext.Initialize(false)执行完毕。

 

 

程序的初始化工做和Ioc工做已经作完,nop默认引擎已经初始化。

下面在回到global文件的启动方法Application_Start()中,

1,继续分析下面的代码:

           var dependencyResolver = new NopDependencyResolver();
            DependencyResolver.SetResolver(dependencyResolver);

这两行代码的做用是:控制器激活的时候,咱们用了自定义的NopDependencyResolver,该类有两个方法一个是GetService(Type serviceType),一个是GetServices(Type serviceType)。使用自定义的该类,主要是为了实现与IOC容器集成。

2,添加自定义模型绑定:   ModelBinders.Binders.Add(typeof(BaseNopModel), new NopModelBinder());

3,  ViewEngines.Engines.Add(new ThemeableRazorViewEngine()); 添加自定义视图引擎。

       ModelMetadataProviders.Current = new NopMetadataProvider();  自定义元数据提供者。

            AreaRegistration.RegisterAllAreas();    注册全部的areas
            RegisterGlobalFilters(GlobalFilters.Filters); 过滤器
            RegisterRoutes(RouteTable.Routes);  路由

       DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
            ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(new NopValidatorFactory()));  添加流验证。

4,      从程序集中把全部资源视图取出来,而后asp.net 编译系统中注册这些视图。

var embeddedViewResolver = EngineContext.Current.Resolve<IEmbeddedViewResolver>();
            var embeddedProvider = new EmbeddedViewVirtualPathProvider(embeddedViewResolver.GetEmbeddedViews());
            HostingEnvironment.RegisterVirtualPathProvider(embeddedProvider);

5,最后咱们启动计划任务,代码以下:

                TaskManager.Instance.Initialize();
                TaskManager.Instance.Start();

    下面分析计划任务中都干了什么事。

相关文章
相关标签/搜索