上文咱們已經經過該行代碼: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();
下面分析計劃任務中都幹了什麼事。