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();

    下面分析計劃任務中都幹了什麼事。

相關文章
相關標籤/搜索