zoukankan      html  css  js  c++  java
  • Nop源码分析二

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

    通过该实例进行以下操作。

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

    通过反射能够获取到8个实现了该接口的实例,下面我们一个个分析,实现了这些接口的类都做了什么事情。

    1,DependencyRegistrar : IDependencyRegistrar

        A:注册HTTP context and other related stuff,

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

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

       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)执行完毕。

  • 相关阅读:
    MySQL系列(四)--数据库结构优化、范式化与反范式化
    Java数据结构和算法(二)--队列
    Java数据结构和算法(一)--栈
    MySQL系列(三)--MySQL存储引擎
    Java集合(六)--ArrayList、LinkedList和Vector对比
    Java集合(五)--LinkedList源码解读
    Java集合(四)--基于JDK1.8的ArrayList源码解读
    P1048 采药(洛谷,动态规划递推,01背包原题)
    P1091 合唱队形题解(洛谷,动态规划LIS,单调队列)
    语法摔过的坑(用来给自己看的,粗糙,勿点)
  • 原文地址:https://www.cnblogs.com/SeaTop/p/5514041.html
Copyright © 2011-2022 走看看