上文我们已经通过该行代码: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)执行完毕。
程序的初始化工作和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();
下面分析计划任务中都干了什么事。