上文我們已經通過該行代碼: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)執行完畢。